Russian Qt Forum
Ноябрь 22, 2024, 19:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача данных по https  (Прочитано 9198 раз)
troorl
Гость
« : Декабрь 16, 2006, 20:28 »

Программа должна отослать запрос и получить ответ по https. Каким образом это можно реализовать? Нужен наиболее простой вариант, так как функционала особого не надо.
Записан
Dendy
Гость
« Ответ #1 : Декабрь 17, 2006, 00:33 »

Если я не ошибаюсь, то всё достаточно просто:

Код:

QtSslSocket * socket = new QtSslSocket( QtSslSocket::Cliet );
connect( socket, SIGNAL(connected()), SLOT(connected()) );

...
void This::connected()
{
  QHttp * http = new Http( "www.site.com", 80, this );
  http->setSocket( socket );
  // get OR post
}
Записан
yshurik
Гость
« Ответ #2 : Декабрь 19, 2006, 00:57 »

Цитата: "Dendy"
Если я не ошибаюсь, то всё достаточно просто:

Код:

QtSslSocket * socket = new QtSslSocket( QtSslSocket::Cliet );
connect( socket, SIGNAL(connected()), SLOT(connected()) );

...
void This::connected()
{
  QHttp * http = new Http( "www.site.com", 80, this );
  http->setSocket( socket );
  // get OR post
}


Вопрос в догонку

Можно ли и как в Qt воспользоваться proxy в данном случае для https?
Записан
Вудруф
Гость
« Ответ #3 : Декабрь 19, 2006, 07:44 »

+1
Уже задавал вопрос, но ответа так и не получил.

Иными словами, http с proxy работает, а https с proxy - не работает Грустный
Записан
troorl
Гость
« Ответ #4 : Январь 16, 2007, 18:53 »

Цитата: "Dendy"
Если я не ошибаюсь, то всё достаточно просто:

Код:

QtSslSocket * socket = new QtSslSocket( QtSslSocket::Cliet );
connect( socket, SIGNAL(connected()), SLOT(connected()) );

...
void This::connected()
{
  QHttp * http = new Http( "www.site.com", 80, this );
  http->setSocket( socket );
  // get OR post
}

Однако я не нашёл в Assistant этого класса. И в /usr/include его нету... Может это для QT3? Потому что я ищё в QT4.
Записан
Dendy
Гость
« Ответ #5 : Январь 16, 2007, 19:58 »

ЗабьІл сказать. QtSslSocket - класс из солюшенов. Ищите на лесном базаре.
Записан
troorl
Гость
« Ответ #6 : Январь 16, 2007, 20:52 »

Так это, оно ведь платное и насколько я понимаю, под GPL нельзя использовать эти классы...
Записан
Dendy
Гость
« Ответ #7 : Январь 17, 2007, 01:32 »

Оно то да. Но никто не мешает подсмотреть исходники и сделать по своему. Исходников там кот наплакал - 60кб два файла с комментариями.
Записан
troorl
Гость
« Ответ #8 : Январь 17, 2007, 20:03 »

Ок. Пока забудем о лицензиях.
Есть форма ввода пароля. Вот она в упрощённом виде:
Код:

<FORM ACTION="https://bla-bla" METHOD="POST">
<INPUT type=text ID=login NAME=login TABINDEX=1 class=auth SIZE=20 MAXLENGTH=20>
<INPUT align=left ID=p type=password NAME=p TABINDEX=2 class=auth SIZE=19 MAXLENGTH=20>
<INPUT type=image onMouseDown="this.src='../images/logo/3_1_1.gif';";
    onMouseOut="this.src='../images/logo/3_1.gif';" src="../images/logo/3_1.gif" alt='Вход' border=0>
<INPUT type=hidden NAME=scr VALUE='e14a534a6358930b76849224abefded5c6ee431c'>
<INPUT type=hidden NAME=action VALUE='login'>
</FORM>

Вот такие поля она передаёт:
Код:
login
p
src
action

Эта форма работает - логин проходит. Но вот, если логинится из моей программы, мне возвращается та самая форма... Не понимаю, в чём дело. Вот отрезок кода:
Код:

socket->connectToHost("some-host", 443);
my_http->setHost("some-host", 443);
my_http->setSocket(socket);
QHttpRequestHeader header("POST", "/index.spl");
    header.setValue("Host", "some-host");
    header.setContentType("application/x-www-form-urlencoded");
    my_http->request(header, "login=****&p=******&src=58b28b0351e2126466ade74ce709cad9b34e704f&action=login");

Может я где-то опростоволосился?
Записан
Dendy
Гость
« Ответ #9 : Январь 17, 2007, 21:25 »

Я так понимаю socket - ето QtSslSocket? А разве не нужно подождать, пока пройдет хендшейк? Другими словами - делать QHttp::request() после того как произошел коннект. Сам к HTTPS не коннектился, размьІшляю только теоретически.
Записан
troorl
Гость
« Ответ #10 : Январь 17, 2007, 21:47 »

Цитата: "Dendy"
Я так понимаю socket - ето QtSslSocket? А разве не нужно подождать, пока пройдет хендшейк? Другими словами - делать QHttp::request() после того как произошел коннект. Сам к HTTPS не коннектился, размьІшляю только теоретически.
Ну по поводу https как такового у меня нет замечаний - форма тоже в в https и она нормально передаётся. А вот как быть с данными, это вопрос... Грустный
Записан
nova
Гость
« Ответ #11 : Январь 17, 2007, 22:23 »

А по моему надо так:
Код:

QHttpRequestHeader header("POST", "/index.spl");
header.setValue("Host", "some-host");
header.setValue ("login","***");
header.setValue ("p","***");
header.setValue ("src","58b28b0351e2126466ade74ce709cad9b34e704");
header.setValue ("action","login");
 my_http->request(header);
Записан
troorl
Гость
« Ответ #12 : Январь 18, 2007, 15:19 »

Цитата: "nova"
А по моему надо так:
Код:

QHttpRequestHeader header("POST", "/index.spl");
header.setValue("Host", "some-host");
header.setValue ("login","***");
header.setValue ("p","***");
header.setValue ("src","58b28b0351e2126466ade74ce709cad9b34e704");
header.setValue ("action","login");
 my_http->request(header);

И так тоже попробовал - тот же результат.
Но вот что интересно: если вводить неправильные данные, то об этом на форме указывается. А у меня никаких ошибок. Это означает, что данные вовсе туда не доходят. Это очень странно...

добавлено спустя 16 часов:

 Я попробовал сделать аналогичную форму у себя на локалхосте. Сделал небольшой питоновский скрипт, который бы выводил переданные значения. Так вот, и из html-формы, и из моей программы данные нормально передаются.
Выходит, что вся загвоздка в ssl-сокете. Но вот куда копать, я без понятия...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 21.