Frage

Ich versuche, diese folgende URL zu erhalten mit der downloadURL Funktion wie folgt:

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

Aber die Daten nicht als das, was wir über den Browser sehen können, jetzt weiß ich, es ist, weil einige korrekten Informationen (wie Browser-Typ) benötigt werden. Wie kann ich wissen, welche Art von Informationen, die ich festlegen müssen, und wie kann ich es einstellen? (Von setHeader Funktion oder eine andere Art und Weise ??)

In VC ++ können wir CInternetSession und CHttpConnection Objekt zu erhalten, die richtigen Daten ohne Einstellung andere Detailinformationen verwenden, gibt es eine ähnliche Art und Weise in Qt oder anderem plattformübergreifende C ++ Netzwerk lib ?? (Ja, ich brauche das die plattformübergreifende Eigenschaft.)

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; }

Mit dem VC, wir können dies nur tun, dann die richtigen Daten im 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();

}
War es hilfreich?

Lösung

Schließen, aber Sie setzen nicht den richtigen Header. Sie tun müssen:

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)" );

Andere Tipps

Sie setzen falsche Content-Type-Header. Der Wert, den Sie zur Verfügung gestellt fits mehr User-Agent-Header

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top