2010-12-22 12 views
6

私はこの一日中、何の成功も見せていません。問題の解決にお役立てください。グーグルで私は多くのユーザーがこの問題を抱えていたが、私は解決策を見つけることができなかった。私はすでに(私の質問は、Pythonの問題ではないので、Qtのプロを助けてください)Pythonのに..私は知っている、私はどこか間違っていることをやって試してみましたが、私はQT C++ &にHTTPポストを実行しようとしていQT HTTPサーバーに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で同じことを行うことができないだということです。問題私が直面しています:クッキーを保持

  1. 取り扱いクッキーリダイレクトの取り扱い
  2. (HTTP 302)
  3. は将来のPOST

すべてこれはpythonで自動的に行われるようにします。以下 、コードを直接関連していないが、私はクッキーが彼らはから取得されたURLにリンクしていると思うのコードがvery similar to the link I used to make it..

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()<<data_size.toFloat(); 
    qDebug()<<manager->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; 
} 
+0

QTを使ってアプリを作るのはこれが私の最初の試みです。標準に準拠していない場合は、私にご負担ください。 –

答えて

7

私はクッキーを取得するためにこれを使用する:

SomeDialog::SomeDialog(QWidget *parent) 
    : QDialog(parent) 
     , urlSearch("www.someotherurlyoumightneed.com") 
    , urlCookie("www.urltogetcookie.from") 
{ 
    ui.setupUi(this); 

    //manager is a QNetworkAccessManager 
    manager.setCookieJar(new QNetworkCookieJar); 
    connect(&manager, SIGNAL(finished(QNetworkReply*)), 
     SLOT(slotReplyFinished(QNetworkReply*))); 

    //this is a QNetworkRequest 
    //here i tell how the post methods are encoded 
    searchReq.setUrl(urlSearch); 
    searchReq.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded"); 

    //get cookie 
    manager.get(QNetworkRequest(urlCookie)); 
    lblStatus->setText("Getting cookie"); 
} 

void SomeDialog::slotReplyFinished(QNetworkReply* reply){ 
    reply->deleteLater(); 

    if(reply->error() != QNetworkReply::NoError){ 
     QMessageBox::warning(this,QString(), tr("Error while downloading information!\n%1").arg(reply->errorString())); 

     return; 
    } 

    //Here i check if there is a cookie for me in the reply and extract it 
    QList<QNetworkCookie> cookies = qvariant_cast<QList<QNetworkCookie>>(reply->header(QNetworkRequest::SetCookieHeader)); 
    if(cookies.count() != 0){ 
     //you must tell which cookie goes with which url 
     manager.cookieJar()->setCookiesFromUrl(cookies, urlSearch); 
    } 

    //here you can check for the 302 or whatever other header i need 
    QVariant newLoc = reply->header(QNetworkRequest::LocationHeader); 
    if(newLoc.isValid()){ 
     //if it IS a reloc header, get the url it points to 
     QUrl url(newLoc.toString()); 
     _req.setUrl(url); 
     _pendingReq.insert(_manager.get(_req)); 
     return; 
    } 

    //if you have multiple urls you are waiting for replys 
    //you can check which one this one belongs to with 
    if(reply->url() == urlSearch){ 
     //do something 
    } 
} 

void SomeDialog::slotSearch(){ 
    //Here we set the data needed for a post request 
    QList<QNetworkCookie> cookies = manager.cookieJar()->cookiesForUrl(urlSearch); 
    for(auto it = cookies.begin(); it != cookies.end(); ++it){ 
     searchReq.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(*it)); 
    } 

    QUrl post; 
    post.addQueryItem("firstParameter", s); 
    post.addQueryItem("secondParameter", "O"); 
    QByteArray ba; 
    ba.remove(0,1); //must remove last & 

    searchReq.setUrl(urlSearch); 
    pendingReq.insert(manager.post(searchReq, ba)); 
} 

は、この情報がお役に立てば幸いです。

0

..ですPOSTでリダイレクトを許可するように、これをコード化されました。したがって、別のURLの2番目のPOSTでは、最初のPOSTのCookieはリクエストとともに送信されません。

関連する問題