首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有标头的QNetworkRequest

带有标头的QNetworkRequest
EN

Stack Overflow用户
提问于 2019-04-25 10:58:46
回答 1查看 4.9K关注 0票数 3

我使用Qt与GraphQL主机进行交互。我使用的是QNetworkRequest,登录过程做得很好,给了我一个JSON格式的token。从那时起,GraphQL希望token位于header中:

代码语言:javascript
复制
{
   "Authorization": "Bearer <token>"
}

通过测试服务器,我编写了一个很好的Python代码:

代码语言:javascript
复制
headers = {'Authorization': "Bearer {0}".format(token)}
url = "http://example.com:8000/graphql"
params = {'query': '{fieldQueries{fields(userId:"xxx"){fieldName fieldID}}}'} 
result = requests.post(url, params=params, headers=headers)
print(result.json())

下面的代码应该在Qt中执行相同的操作:

代码语言:javascript
复制
QUrl url = QUrl("http://example.com:8000/graphql");
QNetworkAccessManager * mgr = new QNetworkAccessManager(this);
QNetworkRequest request(url);
QString query = QString("{fieldQueries{fields(userId:\"%1\"){fieldName fieldID}}}").arg(userId);
QUrlQuery params;
params.addQueryItem("query", query);

connect(mgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(onQueryFinish(QNetworkReply*)));
connect(mgr, SIGNAL(finished(QNetworkReply*)), mgr, SLOT(deleteLater()));

auto header = QString("Bearer %1").arg(token);
request.setRawHeader(QByteArray("Authorization"), header.toUtf8());

mgr->post(request, params.query().toUtf8());

但是,服务器返回一个internal server error (500)

一旦我注释掉了request.setRawHeader,服务器就会在没有错误的情况下返回You are not authorized to run this query.\nNot authenticated

  • 如何使Qt正确发送此标头?
  • 我不知道这是否有帮助,但我使用WireShark检查了数据包。Python为该请求生成的数据包是一个包(约750个字节),尽管Qt请求被分解为两个包,第一个包的长度为600字节。

工作一揽子计划:

代码语言:javascript
复制
...POST /graphql?query=%7BfieldQueries%7Bfields%28userId%3A%22xxx%22%29%7BfieldName+fieldID%7D%7D%7D
HTTP/1.1..Host: xxx:8000..
User-Agent: python-requests/2.21.0..
Accept-Encoding: gzip, deflate..
Accept: */*..
Connection: keep-alive..
Content-Type: application/json..
Authorization: Bearer <688 bytes token>..Content-Length: 0....

Qt生成的包:

代码语言:javascript
复制
....POST /graphql HTTP/1.1..Host: xxx:8000..
Authorization: Bearer <364 bytes token>..
Content-Type: application/json..
Content-Length: 113..
Connection: Keep-Alive..
Accept-Encoding: gzip, deflate..
Accept-Language: en-US,*..
User-Agent: Mozilla/5.0....

代码语言:javascript
复制
.e..query=%7BfieldQueries%7Bfields(useId:%22xxx%22)%7BfieldName fieldID%7D%7D%7D

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-29 10:09:17

Graphql 接受都发布了一个GET请求。因此,我用GET代替了post。它将查询作为URL的一部分发送,而不是作为头发送,从捕获的数据包中,我意识到它们是作为正文发送的。解决办法如下:

代码语言:javascript
复制
QNetworkAccessManager * mgr = new QNetworkAccessManager(this);
QString query = QString("{fieldQueries{fields(userId:\"%1\"){fieldName fieldID}}}").arg(userId);
QUrl url = QUrl(QString("http://example.com:8000/graphql?query=%1").arg(query));
QNetworkRequest request(url);

connect(mgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(onQueryFinish(QNetworkReply*)));
connect(mgr, SIGNAL(finished(QNetworkReply*)), mgr, SLOT(deleteLater()));

auto header = QString("Bearer %1").arg(token);
request.setRawHeader(QByteArray("Authorization"), header.toUtf8());

mgr->get(request);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55847720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档