كيفية تعيين خصائص QNetworkReply للحصول على صفحات NCBI الصحيحة؟

StackOverflow https://stackoverflow.com/questions/2576117

سؤال

أحاول الحصول على عنوان URL التالي باستخدام وظيفة التنزيل على النحو التالي:

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

لكن البيانات ليست كما يمكننا رؤيتها من خلال المتصفح ، والآن أعلم أن ذلك يرجع إلى أن هناك حاجة إلى بعض المعلومات الصحيحة (مثل نوع المتصفح). كيف يمكنني معرفة نوع المعلومات التي أحتاج إلى ضبطها ، وكيف يمكنني ضبطها؟ (بواسطة وظيفة Setheader أو بطريقة أخرى ؟؟)

في VC ++ ، يمكننا استخدام كائن CinternetSession و CHTTPConnection للحصول على البيانات الصحيحة دون تعيين أي معلومات تفصيلية أخرى ، هل هناك أي طريقة مماثلة في QT أو غيرها من المنصات c ++ شبكة lib؟ (نعم ، أنا بحاجة إلى خاصية المنصات المتقاطعة.)

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

بواسطة VC ، يمكننا فقط القيام بذلك ، ثم البيانات الصحيحة موجودة في 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();

}
هل كانت مفيدة؟

المحلول

أغلق ، لكنك لا تضع الرأس الصحيح. عليك فعل:

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

نصائح أخرى

قمت بتعيين رأس من نوع المحتوى الخاطئ. القيمة التي قدمتها تناسب المزيد من رأس وكيل المستخدم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top