crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как отправить Http-запрос с XML данными?
sindbad07
  опции профиля:
сообщение 26.4.2011, 20:40
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 28.4.2010
Пользователь №: 1671

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте форумчане. Мне надо немного поработать с Ebay API, нашел только пример на Visual Basic, мне надо типа такой функции написать, только на Qt:


Private Function SendHTTPRequest(xmldoc As DOMDocument, ByVal devID As String, ByVal appID As String, _
ByVal certID As String, ByVal version As String, ByVal callname As String, _
ByVal siteID As String, ByVal serverUrl As String) As DOMDocument
'Send the request and get the resonse document
'Create a new HTTP Request object
Dim request As MSXML.XMLHTTPRequest
Set request = New MSXML.XMLHTTPRequest

'add the required headers
With request
.open "POST", serverUrl, False
.setRequestHeader "Content-Type", "text/xml"
.setRequestHeader "X-EBAY-API-COMPATIBILITY-LEVEL", version
.setRequestHeader "X-EBAY-API-DEV-NAME", devID
.setRequestHeader "X-EBAY-API-APP-NAME", appID
.setRequestHeader "X-EBAY-API-CERT-NAME", certID
.setRequestHeader "X-EBAY-API-CALL-NAME", callname
.setRequestHeader "X-EBAY-API-SITEID", siteID
.send xmldoc
End With

If request.Status = 200 Then 'Successful
'set response as an XML Document
Dim response As MSXML.DOMDocument
Set response = request.responseXML
Set SendHTTPRequest = response
End If

End Function



Нашел в Qt пример:

request.setUrl(QUrl("http://qt.nokia.com"));
request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");

Но возникает вопрос: а как отпавить сам XML-файл (данные) запроса? На VB после операторов
".open "POST", serverUrl, False" и
".setRequestHeader "Content-Type", "text/xml""

Идет функция
".send xmldoc"

Чем заменить в Qt, подскажите кто знает.




п.с. Нашел также пример на php, там используется функция setBody(), как же то-же самое задать в Qt (задать не заголовки а само тело запроса)?

// Get entity of http client
$httpClient = new Http_Client('http://svcs.sandbox.ebay.com/services/search/FindingService/' . FINDING_API_VERSION);

// Prepare headers
$httpClient->setHeaders(
array(
'X-EBAY-SOA-OPERATION-NAME: findItemsByKeywords',
'X-EBAY-SOA-SECURITY-APPNAME: ' . APP_ID
)
);

// Prepare body
$httpClient->setBody(
'<?xml version="1.0" encoding="utf-8"?>
<findItemsByKeywordsRequest xmlns="http://www.ebay.com/marketplace/search/v1/services">
<keywords>' . htmlspecialchars($keywords) . '</keywords>
<paginationInput>
<entriesPerPage>10</entriesPerPage>
</paginationInput>
</findItemsByKeywordsRequest>'
);

// Send request
$result = $httpClient->send();

Сообщение отредактировал sindbad07 - 26.4.2011, 22:31
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 27.4.2011, 8:11
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Все просто:

QByteArray body = "<xml version..."; // Содержание запроса

QNetworkRequest request;
request.setUrl(...);
request.setHeader(QNetworkRequest::ContentLengthHeader,body.count()); // Заголовок Content-Length
request.setRawHeader("X-EBAY-API-COMPATIBILITY-LEVEL", version );
request.setRawHeader("X-EBAY-API-DEV-NAME", devId );
// etc.

QNetworkReply *reply = networkManager.post(request,body); // Отсюда начинается посылка запроса (networkManager имеет тип QNetworkAccessManager)

connect(reply,SIGNAL(finished()),....); // Чтобы узнать о том, когда запрос завершится (причем успешно или нет), соединяемся с сигналом


Так же у класса QNetworkAccessManager есть перегруженный метод post ( const QNetworkRequest & request, QIODevice * data ) (подробности в доках),
который может напрямую послать в качестве тела HTTP запроса, например, данные из файла
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sindbad07
  опции профиля:
сообщение 27.4.2011, 10:51
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 28.4.2010
Пользователь №: 1671

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(PAFOS @ 27.4.2011, 9:11) *
Все просто:

QByteArray body = "<xml version..."; // Содержание запроса

QNetworkRequest request;
request.setUrl(...);
request.setHeader(QNetworkRequest::ContentLengthHeader,body.count()); // Заголовок Content-Length
request.setRawHeader("X-EBAY-API-COMPATIBILITY-LEVEL", version );
request.setRawHeader("X-EBAY-API-DEV-NAME", devId );
// etc.

QNetworkReply *reply = networkManager.post(request,body); // Отсюда начинается посылка запроса (networkManager имеет тип QNetworkAccessManager)

connect(reply,SIGNAL(finished()),....); // Чтобы узнать о том, когда запрос завершится (причем успешно или нет), соединяемся с сигналом


Так же у класса QNetworkAccessManager есть перегруженный метод post ( const QNetworkRequest & request, QIODevice * data ) (подробности в доках),
который может напрямую послать в качестве тела HTTP запроса, например, данные из файла



Спасибо за такой развернутый ответ, сегодня буду пробовать :)
На соседнем форуме предложили попробовать следующее:

QNetworkReply * QNetworkAccessManager::sendCustomRequest ( const QNetworkRequest & request, const QByteArray & verb, QIODevice * data = 0 )
где const QByteArray & verb - это видимо "body" и есть?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 27.4.2011, 16:30
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Цитата
QNetworkReply * QNetworkAccessManager::sendCustomRequest ( const QNetworkRequest & request, const QByteArray & verb, QIODevice * data = 0 )


verb - дополнения к заголовку HTTP
data - body HTTP запроса
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.9.2019, 0:05