QT HTTP Post Проблема, когда сервер требует файлов cookie

Я пытался весь день безуспешно. Прошу помощи в решении вопроса. При поиске в Google я обнаружил, что у многих пользователей была эта проблема, но нигде я не мог найти решение.

Я пытаюсь сделать HTTP-сообщение на QT C ++, и я уже пробовал сделать это на python (Мой вопрос не вопрос python , так что Qt-профи, пожалуйста, помогите ) .. Я знаю, я ошибаюсь в обработке файлов cookie и прочего, поэтому, пожалуйста, помогите. Пожалуйста, укажите возможные решения.

В Python код чистый и простой. Я убрал обработку ошибок и все лишнее, чтобы упростить ее.

url = 'http://www.example.com/'
data = 'username=abc&password=passwd'
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
usock = opener.open(url, data)
#>>>>>> NOW, I have the cookiejar <<<<<<<<<

opener.addheaders = [('Referer','http://www.example.com/xyz.php'),('User-Agent','Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3 GTB7.0')]
data_to_send = 'ABCDEFGH'
url_send = "http://www.example.com/xyz.php"
send = opener.open(url_send,data_to_send)

Эквивалент QT, который я сделал: -

void SmsSender::sendToMyCantos()
{
    manager = new QNetworkAccessManager(this);
    manager->setCookieJar(new QNetworkCookieJar(manager));
    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));
    request.setUrl(QUrl("http://www.mycantos.com"));
    postData.append("username=abc&password=passwd");
    manager->post(request,postData);
    //>>>>>> So, I feel that I have CookieJar now to make POST <<<<<<<

    request.setRawHeader("Referer","http://www.example.com/xyz.php");
    request.setRawHeader("User-Agent","Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3 GTB7.0");

    postData.clear();
    postData.append("ABCDEFGH");
    request.setUrl(QUrl("http://www.example.com/xyz.php"));

    manager->post(request,postData);
}

Теперь проблема в том, что я не могу сделать то же самое в QT. Проблемы, с которыми я сталкиваюсь: Ниже код не имеет прямого отношения, но я закодировал его, чтобы разрешить перенаправление в POST .. Код очень похож на ссылку, которую я использовал для этого ..

QUrl SmsSender::redirectUrl(const QUrl& possibleRedirectUrl,
                               const QUrl& oldRedirectUrl) const {
        //Checking infinite resursions
        QUrl redirectUrl;
        if(!possibleRedirectUrl.isEmpty() &&
           possibleRedirectUrl != oldRedirectUrl) {
                redirectUrl = possibleRedirectUrl;
        }
        return redirectUrl;
}

void SmsSender::replyFinished(QNetworkReply *reply)
{
    QVariant possibleRedirectUrl =
             reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
    QVariant data_size = reply->header(QNetworkRequest::ContentLengthHeader);
    qDebug()<cookieJar()->cookiesForUrl(QUrl("http://www.example.com"));

    /* We'll deduct if the redirection is valid in the redirectUrl function */
    _urlRedirectedTo = this->redirectUrl(possibleRedirectUrl.toUrl(),
                                         _urlRedirectedTo);

    /* If the URL is not empty, we're being redirected. */
    if(!_urlRedirectedTo.isEmpty()) {
            QString text = QString("SmsSender::replyFinished: Redirected to ")
                                  .append(_urlRedirectedTo.toString());
    qDebug(text.toAscii());

    // Do again in case we have more redirections

    this->_qnam->get(QNetworkRequest(_urlRedirectedTo));
    }
    else
    {
        QString text = QString("SmsSender::replyFinished: Arrived to ")
                                  .append(reply->url().toString());
        qDebug(text.toAscii());
        _urlRedirectedTo.clear();
    }

}

QNetworkAccessManager* SmsSender::createQNAM() {
        QNetworkAccessManager* qnam = new QNetworkAccessManager(this);
        /* We'll handle the finished reply in replyFinished */
        connect(qnam, SIGNAL(finished(QNetworkReply*)),
                this, SLOT(replyFinished(QNetworkReply*)));
        return qnam;
}

6
задан Abhijeet Rastogi 22 December 2010 в 13:02
поделиться