Ответ 1
Ваше решение почти правильно. Но следует использовать:
data = params.encodedQuery();
вместо
data.append(params.toString());
data.remove(0,1);
для правильной обработки строк UTF8.
Как я могу создать HTTP POST-запрос с некоторыми URL-кодированными параметрами, используя Qt 4.6.1?
Я понял, что могу создать QNetworkRequest, установить все параметры там и отправить его через почтовый метод QNetworkAccessManagers. Но как я могу добавить в запрос некоторые URL-кодированные параметры?
В конце концов, я хочу получить доступ к http://www.eveonline.com/api/doc/example-python.asp
Мне это удалось, используя что-то вроде (все еще нужно реорганизовать и сформировать во что-то полезное):
QNetworkReply *requestApi(QNetworkAccessManager &nwam)
{
QNetworkRequest request(QUrl("http://api.eve-online.com/account/Characters.xml.aspx"));
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
QByteArray data;
QUrl params;
params.addQueryItem("userid","user");
params.addQueryItem("apiKey","key");
data.append(params.toString());
data.remove(0,1);
QNetworkReply *reply = nwam.post(request,data);
return reply;
}
Ваше решение почти правильно. Но следует использовать:
data = params.encodedQuery();
вместо
data.append(params.toString());
data.remove(0,1);
для правильной обработки строк UTF8.
Извините, что я только нахожу ваш пост этим поздно. Тем не менее, я все равно попытаюсь помочь, если кто-то еще найдет ответ.
Случайно, я также работаю над приложением EVE API, и я также пробовал то же самое. К сожалению, QNetworkManager
не работает так, потому что он отправляет запрос асинхронно. Вы должны подключить слот к его сигналу finished(QNetworkReply*)
.
Я делаю это, делая запрос с отдельным классом под названием EveConnector
, обрабатывая ответ в слоте, подключенном к сигналу QNetworkManager
finished
, а затем вызывает обратный запрос через собственный класс класса соединителя.
Я бы с радостью поделился кодом, если вы спросите.