2010-12-22 12 views
6

Ich habe diesen ganzen Tag ohne Erfolg versucht. Bitte helfen Sie bei der Lösung des Problems. Beim Googlen fand ich viele Benutzer, die dieses Problem hatten, aber nirgendwo konnte ich eine Lösung finden.QT HTTP Post-Problem, wenn Server Cookies benötigt

Ich versuche, HTTP-Post in QT C zu tun ++ & Ich habe bereits versucht, dass in Python zu tun (Meine Frage ist nicht ein Python-Frage, so Profis Qt bitte helfen) .. Ich weiß, ich bin irgendwo falsch Umgang mit Cookies und alle, also bitte helfen. Bitte geben Sie mögliche Lösungen an.

In Python ist Code sauber und einfach. Ich habe die Fehlerbehandlung und alle zusätzlichen Dinge entfernt, um es einfacher zu machen.

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) 

Die QT-äquivalent ich gemacht: -

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

Nun das Problem ist, dass ich nicht in der Lage bin gleich in QT zu tun. Ich bin vor Probleme:

  1. Umgang mit Cookies
  2. Handhabung Umleitungen (HTTP 302)
  3. Cookies Halte für alle künftigen POST

dies geschieht automatisch in Python zu machen. Im Folgenden wird der Code nicht direkt verwandt, aber ich codiert diese in der POST zu ermöglichen Umleitungen .. Der Code 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

Dies ist mein erster Versuch, QT zu verwenden, um eine App zu erstellen, also bitte bitte mit mir, wenn es nicht gemäß den Standards richtig ist. –

Antwort

7

Ich benutze dies ein Cookie zu erhalten:

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

Hoffnung, das hilft.

0

ist Ich denke, Cookies, um die URLs verknüpft sind sie erhalten werden. In Ihrem zweiten POST mit einer anderen URL werden die Cookies vom ersten POST nicht mit der Anfrage gesendet.

Verwandte Themen