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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QT Post-запрос  (Прочитано 28790 раз)
svadim
Гость
« Ответ #15 : Январь 11, 2012, 18:53 »

Возникла схожая проблема, как и у автора темы. Решил спросить здесь же.
Имеется php-скрипт. Qt-приложение через QNetworkAccessManager отправляет ему некие данные POST-запросом. Проблема в том, что сам скрипт "отрабатывает", но параметры он не получает.
Вот сам скрипт(т.е. то что от него осталось, специально для тестов):
Код
PHP
<?php
$fileHandler = fopen("./log.txt", "w");
fwrite($fileHandler, serialize($_POST));
fclose($fileHandler);
echo "hello";
?>
 

А вот собственно и кусок Qt-кода:
Код
C++ (Qt)
QUrl url("http://127.0.0.1/test.php? ");
QByteArray body = "a=1&b=2";
 
QNetworkRequest request;
request.setUrl(url);
request.setHeader(QNetworkRequest::ContentLengthHeader, body.count());
request.setRawHeader("User-Agent", "MyApp 1.0");
request.setRawHeader("Host", url.encodedHost());
request.setRawHeader("Cache-Control", "no-cache");
request.setRawHeader("Content-Type", "text/html");
request.setRawHeader("Accept", "*/*");
 
QNetworkAccessManager *mgr = new QNetworkAccessManager(this);
QObject::connect(mgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(getResult(QNetworkReply*)));
mgr->post(request, body);

Чего только не пробовал, параметры не получаю(получаю только ответ "hello"). Скрипт тестил на IIS и Apache. Машины разные. Через веб-морду скрипт нормально работает. Параметры через заголовки передавал(с пустым боди), результат тот же. Испробовал предложенный здесь класс для работы с запросами, тоже безрезультатно. Подозреваю, что всё-таки загвоздка может быть в отправляемых данных заголовка, но не хватает скилла понять где именно.
Прошу помочь тех кто в курсе данной темы.
Записан
thechicho
Гость
« Ответ #16 : Январь 11, 2012, 19:21 »

а не проще сделать гет запрос http://127.0.0.1/test.php?a=1&b=2

request.setHeader(QNetworkRequest::ContentLengthHeader, body.count());
request.setRawHeader("User-Agent", "MyApp 1.0");
request.setRawHeader("Host", url.encodedHost());
request.setRawHeader("Cache-Control", "no-cache");
request.setRawHeader("Content-Type", "text/html");
request.setRawHeader("Accept", "*/*");

это нахрен не надо, ты же на свой скрипт шлешь.

а твой косяк, я хз, но на первый взгляд из-за ? в конце QUrl url("http://127.0.0.1/test.php? ")
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #17 : Январь 11, 2012, 19:29 »

а не проще сделать гет запрос http://127.0.0.1/test.php?a=1&b=2
отличная рекомендация
а твой косяк, я хз, но на первый взгляд из-за ? в конце QUrl url("http://127.0.0.1/test.php? ")
да, скорее всего дело в двух последних символах - знаке вопроса и пробеле
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ufna
Гость
« Ответ #18 : Январь 11, 2012, 19:36 »

ну потому что когда запрос идет таким образом, то его не нужно в "body" пихать, это сам реквест, в url'е. а то, что ты хочешь сделать, оно для реальных POST-запросов, гда данные идут в сыром виде: http://blog.ufna.ru/2010/10/16/qt-post-multipart-form-data
Записан
svadim
Гость
« Ответ #19 : Январь 11, 2012, 19:41 »

Убрал лишнее(собственно изначально у меня всё так и было, но не работало). Вобщем код получился такой:
Код
C++ (Qt)
QUrl url("http://127.0.0.1/test.php");
QByteArray body = "a=1&b=2";
 
QNetworkRequest request;
request.setUrl(url);
 
QNetworkAccessManager *mgr = new QNetworkAccessManager(this);
QObject::connect(mgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(getResult(QNetworkReply*)));
mgr->post(request, body);
он не работает.
GET-запрос работает. Но, нужен POST. Ибо конечный front-end только через него работает.
« Последнее редактирование: Январь 11, 2012, 19:45 от svadim » Записан
thechicho
Гость
« Ответ #20 : Январь 11, 2012, 20:50 »

// QObject::connect
попробуй просто connect

инклюды покажи
#include <QNetworkReply>
этот есть?

в скрипте добавь
print_r($_POST); // или как там массив выводится, забыл уже


и покажи чо выдает
« Последнее редактирование: Январь 11, 2012, 20:52 от thechicho » Записан
ufna
Гость
« Ответ #21 : Январь 11, 2012, 23:41 »

Код
C++ (Qt)
QByteArray body = "a=1&b=2";
...
mgr->post(request, body);
он не работает.
GET-запрос работает. Но, нужен POST. Ибо конечный front-end только через него работает.

А ты ссылку выше смотрел как формируется body?

У тебя два варианта:
1. реквест сделать QUrl url("http://127.0.0.1/test.php?a=1&b=2"); и проверить
2. делать как в ссылке выше, т.к. тело пост запроса - это все-таки блоки информации, а не просто "a=1&b=2"
Записан
thechicho
Гость
« Ответ #22 : Январь 12, 2012, 00:57 »

ufna, делать как ты советуешь надо, когда отправляешь файлы пост-запросом.

QByteArray = "a=1&b=2";
это тупо отправляется qnam.post(request, postData);

svadim или в пыхе тупит, или на локалхосте как-то по-другому.
я всегда так отправляю простой текст, у меня работает.
Записан
ufna
Гость
« Ответ #23 : Январь 12, 2012, 01:27 »

ну если так, то да, стоит поискать в чем трабла на локалхосте Улыбающийся
Записан
thechicho
Гость
« Ответ #24 : Январь 12, 2012, 01:59 »

кстати, попробуй этот заголовок
request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
Записан
svadim
Гость
« Ответ #25 : Январь 12, 2012, 10:10 »

// QObject::connect
попробуй просто connect

инклюды покажи
#include <QNetworkReply>
этот есть?

в скрипте добавь
print_r($_POST); // или как там массив выводится, забыл уже

и покажи чо выдает

Всё поправил, как вы говорили. Если вебом слать, то пых возврашает:
Код
PHP
Array
(
   [a] => 1
   [b] => 2
)
 
Если же слать через Qt, то получаю пустой:
Код
PHP
Array
(
)
 

кстати, попробуй этот заголовок
request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
А вот это реально помогло. Большое вам спасибо, всё заработало. Если кому-нибудь понадобится, то вот конечный вариант кода, который работает:
Код
C++ (Qt)
QNetworkRequest request(QUrl("http://127.0.0.1/test.php"));
request.setRawHeader("Content-Type", "application/x-www-form-urlencoded"); // without it - does not work
QByteArray body = "a=1&b=2";
QNetworkAccessManager *mgr = new QNetworkAccessManager(this);
connect(mgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(getResult QNetworkReply*)));
mgr->post(request, body);

Если кому интересно почему надо делать так, то здесь объяснение - http://developer.qt.nokia.com/forums/viewthread/4940
Всем спасибо за помощь.
Записан
thechicho
Гость
« Ответ #26 : Январь 12, 2012, 12:52 »

я бы сделал так

QByteArray postData = "a=1&b=2";
QNetworkAccessManeger qnam;
QNetworkReply *reply = qnam.post(request, postData);
QEventLoop loop;
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();

qDebug() << reply->readAll();
reply->deleteLater();
Записан
thechicho
Гость
« Ответ #27 : Январь 12, 2012, 12:56 »

ufna, http://developer.qt.nokia.com/doc/qt-4.8/qt4-8-intro.html

см.
QHttpMultiPart
QHttpPart
Записан
ufna
Гость
« Ответ #28 : Январь 12, 2012, 13:13 »


Ага, видел. Но в конце 2010 еще ни намека на это не было )
Записан
thechicho
Гость
« Ответ #29 : Январь 12, 2012, 13:39 »

у меня тоже без них функция большая есть, влом переписывать. да и смысла не вижу)
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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