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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: XML http запросы - чем наколдовать?  (Прочитано 7574 раз)
sindbad07
Гость
« : Апрель 25, 2011, 22:59 »

Здравствуйте форумчане! Подскажите плиз кто знает - чем воспользоваться в Qt, чтобы отправлять/принимать XML-Http заросы? Мне надобно поработать с Ebay API, там работа идет через XML-запросы.

п.с. Сам искал, пока по нулям, может есть пример какой-нибудь, али плагин с описанием, очень буду рад, если поможете сэкономить мне кучу времени на поиск хоть какого-нибудь мануала Улыбающийся
Записан
Denjs
Гость
« Ответ #1 : Апрель 25, 2011, 23:22 »

http://www.prog.org.ru/topic_15336_0.html

не? поможет?

скажите, а что по вашему из себя _технически_ преставляют "XML-Http запросы"?
Записан
sindbad07
Гость
« Ответ #2 : Апрель 26, 2011, 13:14 »

Denjs, спасибо, правда нифика не понял, что делается в примере.
 
Нашел только пример запроса на Visual Basic, мне надо типа такой функции написать:

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


Тут используется объект MSXML.XMLHTTPRequest, чем можно заменить его в Qt, чтобы в качестве http-запроса отправлять и принимать xml-данные?
Записан
majatu
Гость
« Ответ #3 : Апрель 26, 2011, 17:03 »

проблема решается qtcpsocket или QNetworkAccessManager + QNetworkRequest, шлешь в хеадере что тебе надо, принимаешь соотв также
искать тут нечего, т.к. все зависит от конкретной задачи. Глянь в примерах, как с ним работать http://doc.qt.nokia.com/latest/qnetworkaccessmanager.html

Записан
sindbad07
Гость
« Ответ #4 : Апрель 26, 2011, 20:29 »

 Хорошо, допустим вот эта часть:

        .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

будет выглядеть примерно так:

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

А как быть с этим:

.send xmldoc

Типа должен отправиться xml-объект!
Записан
sindbad07
Гость
« Ответ #5 : Апрель 26, 2011, 21:40 »




п.с. Нашел также пример на 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();
« Последнее редактирование: Апрель 26, 2011, 21:45 от sindbad07 » Записан
Denjs
Гость
« Ответ #6 : Апрель 27, 2011, 00:23 »

$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>'
 );

Код:
QNetworkReply * QNetworkAccessManager::sendCustomRequest ( const QNetworkRequest & request, const QByteArray & verb, QIODevice * data = 0 )
??
где const QByteArray & verb - это видимо "body" и есть?
Записан
majatu
Гость
« Ответ #7 : Апрель 27, 2011, 15:46 »

еж мое, почитай мануал QNetworkAccessManager + post
а также желательно все, что связано с сетью выводить в отдельный поток

Код:
QUrl url("http://test.ru/...куда шлем");
    QNetworkRequest request;
    request.setUrl(url);
    request.setRawHeader("Host", url.encodedHost());
    request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)");
    request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    request.setRawHeader("Accept-Language", "ru,en-us;q=0.7,en;q=0.3");
    request.setRawHeader("Accept-Charset", "utf-8;q=0.7,*;q=0.7");
    request.setRawHeader("Keep-Alive", "300");
    request.setRawHeader("Connection", "keep-alive");
    request.setRawHeader("Referer", "http:/test.ru/..откуда пришли");
    request.setRawHeader("Cookie", "auth=NO");
    request.setRawHeader("Content-Type", "text/xml");

    QByteArray postData;
    postData.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
                    "...твой запрос...");
    QNetworkAccessManager *manager = new QNetworkAccessManager (this);
    QNetworkReply *reply = manager->post(request, postData);
    connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(getError(QNetworkReply::NetworkError)));

принимаем

Код:
void .....::slotReadyRead()
{
    QNetworkReply *reply=qobject_cast<QNetworkReply*>(sender());
    QNetworkAccessManager *manager=qobject_cast<QNetworkAccessManager *>(reply->manager());

    int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

    if (reply->error() == QNetworkReply::NoError)
    {
        //qDebug() << "=================================";
        //qDebug() << "status code: " << statusCode;

        switch (statusCode)
        {
            case 200:
            {
                QByteArray bytes = reply->readAll();
                QString str(QString::fromUtf8(bytes));

                   .............
             }
         }
     }
}
« Последнее редактирование: Апрель 27, 2011, 16:00 от majatu » Записан
Denjs
Гость
« Ответ #8 : Апрель 27, 2011, 16:20 »

еж мое, почитай мануал QNetworkAccessManager + post
а также желательно все, что связано с сетью выводить в отдельный поток
я полагаю автор ещё и искал класс кооторый позволил бы ему не формировать руками XML-ку, а работать с ней методами класса...
ну в общем как с SOAP-пакетами - их тоже можно руками формировать, о как-то уж очень неблагодарное это дело...

хотя XMLHttp должен быть попроще, но все-ж))))
Записан
sindbad07
Гость
« Ответ #9 : Апрель 28, 2011, 17:39 »

majatu, спасибо большое за такой развернутый ответ, седня буду пробовать  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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