Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 服务器需要Cookie时QT HTTP Post问题_C++_Qt_Cookies_Qt4_Qnetworkaccessmanager - Fatal编程技术网

C++ 服务器需要Cookie时QT HTTP Post问题

C++ 服务器需要Cookie时QT HTTP Post问题,c++,qt,cookies,qt4,qnetworkaccessmanager,C++,Qt,Cookies,Qt4,Qnetworkaccessmanager,我试了一整天,但没有成功。请帮忙解决这个问题。在谷歌上,我发现很多用户都有这个问题,但我找不到解决办法 我尝试在Qt+C++中做HTTP POST,我已经在Python 中尝试过(我的问题不是Python问题,所以QT PROSs请帮助< /强>)我知道,我在处理饼干和其他东西时有点不对劲,所以请帮忙。请提供可能的解决方案 在python中,代码简洁明了。我已经剥离了错误处理和所有额外的东西来简化它 url = 'http://www.example.com/' data = 'username

我试了一整天,但没有成功。请帮忙解决这个问题。在谷歌上,我发现很多用户都有这个问题,但我找不到解决办法

<>我尝试在Qt+C++中做HTTP POST,我已经在Python <强>中尝试过(我的问题不是Python问题,所以QT PROSs请帮助< /强>)我知道,我在处理饼干和其他东西时有点不对劲,所以请帮忙。请提供可能的解决方案

在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)
url='1〕http://www.example.com/'
数据='username=abc&password=passwd'
cj=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
usock=opener.open(url、数据)

#>>>>>>现在,我有了cookiejar,所以,我觉得我现在有了cookiejar来制作POST我认为Cookie链接到了它们从中获得的URL。因此,在使用不同URL的第二篇文章中,第一篇文章中的cookie不会随请求一起发送。

我使用此方法获取cookie:

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));
}
SomeDialog::SomeDialog(QWidget*父项)
:QDialog(父级)
,urlSearch(“www.someotherurlyoumagnhtneed.com”)
,urlCookie(“www.urltogetcookie.from”)
{
ui.setupUi(这个);
//manager是一个QNetworkAccessManager
setCookieJar(新的QNetworkCookieJar);
连接(&管理器,信号(已完成(QNetworkReply*)),
插槽(slotReplyFinished(QNetworkReply*));
//这是一个QNetworkRequest
//在这里,我告诉大家post方法是如何编码的
searchReq.setUrl(urlSearch);
searchReq.setHeader(QNetworkRequest::ContentTypeHeader,“application/x-www-form-urlencoded”);
//拿饼干
get(QNetworkRequest(urlCookie));
lblStatus->setText(“获取cookie”);
}
void SomeDialog::slotReplyFinished(QNetworkReply*reply){
回复->删除稍后();
如果(回复->错误()!=QNetworkReply::无错误){
QMessageBox::警告(这是,QString(),tr(“下载信息时出错!\n%1”).arg(回复->错误字符串());
返回;
}
//在这里,我检查回复中是否有我的cookie,并提取它
QList cookies=qvariant_cast(回复->标题(QNetworkRequest::SetCookieHeader));
如果(cookies.count()!=0){
//您必须知道哪个cookie与哪个url一起使用
manager.cookieJar()->setCookiesFromUrl(cookies,urlSearch);
}
//在这里,你可以检查302或任何其他标题我需要
QVariant newLoc=reply->header(QNetworkRequest::LocationHeader);
if(newLoc.isValid()){
//如果它是一个reloc头,获取它指向的url
QUrl url(newLoc.toString());
_请求设置url(url);
_pendingReq.insert(_-manager.get(_-req));
返回;
}
//如果您有多个URL,您正在等待回复
//你可以用它来检查这一个属于哪一个
如果(回复->url()==urlSearch){
//做点什么
}
}
void SomeDialog::slotSearch(){
//这里我们设置post请求所需的数据
QList cookies=manager.cookieJar()->cookiesForUrl(urlSearch);
用于(自动it=cookies.begin();it!=cookies.end();+it){
searchReq.setHeader(QNetworkRequest::CookieHeader,QVariant::fromValue(*it));
}
库尔邮政;
post.addQueryItem(“firstParameter”,s);
post.addQueryItem(“第二个参数”,“O”);
QByteArray ba;
ba.remove(0,1);//必须最后删除&
searchReq.setUrl(urlSearch);
pendingReq.插入(经理职位(searchReq,ba));
}

希望这能有所帮助。

这是我第一次尝试使用QT制作应用程序,因此如果它不符合标准,请原谅我。我们是否应该设置:searchReq.setHeader(QNetworkRequest::CookieHeader,QVariant::fromValue(cookies));正如标题所期望的那样?
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;
}
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));
}