2010-04-04 7 views
0

Я пытаюсь получить этот следующий URL-адрес с помощью функции downloadURL следующим образом:Как установить свойства QNetworkReply, чтобы получить правильные страницы NCBI?

http://www.ncbi.nlm.nih.gov/nuccore/27884304

Но данные не так, что мы можем видеть через браузер, теперь я знаю, что это из-за какой-то правильной информации (например, тип браузера). Как я могу узнать, какую информацию мне нужно установить, и как ее установить? (С помощью функции setHeader или каким-либо другим способом?)

В VC++ мы можем использовать CInternetSession и объект CHttpConnection для получения правильных данных без установки какой-либо другой подробной информации, есть ли аналогичный способ в Qt или другой кросс-платформенной C++ сетевая библиотека? (Да, мне нужно свойство кросс-платформенный.)

QNetworkReply::NetworkError downloadURL(const QUrl &url, QByteArray &data) { 
    QNetworkAccessManager manager; 
    QNetworkRequest request(url); 
    request.setHeader(QNetworkRequest::ContentTypeHeader ,"Mozilla/5.0 (Windows; U; Windows NT 
6.0; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)"); 
    QNetworkReply *reply = manager.get(request); 

    QEventLoop loop; 
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); 
    loop.exec(); 


    QVariant statusCodeV = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); 
    QUrl redirectTo = statusCodeV.toUrl(); 

    if (!redirectTo.isEmpty()) 
    { 
     if (redirectTo.host().isEmpty()) 
     { 
      const QByteArray newaddr = ("http://"+url.host()+redirectTo.encodedPath()).toAscii(); 
      redirectTo.setEncodedUrl(newaddr); 
      redirectTo.setHost(url.host()); 
     } 
     return (downloadURL(redirectTo, data)); 
    } 

    if (reply->error() != QNetworkReply::NoError) 
    { 
     return reply->error(); 
    } 
    data = reply->readAll(); 
    delete reply; 
    return QNetworkReply::NoError; } 

ВК, мы можем просто сделать это, то правильно данные в CHttpFile.

CString downloadURL (CString sGetFromURL) 
{ 
    // create an internet session 
    CInternetSession csiSession; 

    int pos; 
    BOOL neof; 

    // parse URL to get server/object/port 

    DWORD dwServiceType; 
    CString sServerName; 
    CString sObject; 
    INTERNET_PORT nPort; 
    CHttpConnection* pHTTPServer = NULL; 
    CHttpFile* pFile = NULL; 


     AfxParseURL (sGetFromURL, dwServiceType, sServerName, sObject, nPort); 

     // open HTTP connection 
     pHTTPServer = csiSession.GetHttpConnection (sServerName, nPort); 

     // get HTTP object 
     pFile = pHTTPServer->OpenRequest (CHttpConnection::HTTP_VERB_GET, sObject, NULL, 1, NULL, NULL, INTERNET_FLAG_RELOAD); 

     pFile->SendRequest(); 

} 

ответ

1

Закрыть, но вы не устанавливаете правильный заголовок. Вам нужно сделать:

request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)"); 
+0

Спасибо :) Я нашел какой-то другой URL, чтобы получить данные. Тем не менее, все еще хорошо знать, где проблема в моем коде. В следующий раз я буду знать, как это сделать ^^ –

2

Вы устанавливаете неправильный заголовок Content-Type. Указанное вами значение больше подходит для заголовка User-Agent

+0

Спасибо :) Я нашел некоторые другие Url, чтобы получить данные, но он по-прежнему полезно для решения этой проблемы –