C++ 服务器需要Cookie时QT HTTP Post问题
我试了一整天,但没有成功。请帮忙解决这个问题。在谷歌上,我发现很多用户都有这个问题,但我找不到解决办法 <>我尝试在Qt+C++中做HTTP POST,我已经在Python <强>中尝试过(我的问题不是Python问题,所以QT PROSs请帮助< /强>)我知道,我在处理饼干和其他东西时有点不对劲,所以请帮忙。请提供可能的解决方案 在python中,代码简洁明了。我已经剥离了错误处理和所有额外的东西来简化它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
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));
}