gpt4 book ai didi

qt - 带标题的 QNetworkRequest

转载 作者:行者123 更新时间:2023-12-05 07:23:39 26 4
gpt4 key购买 nike

我正在使用 Qt 与 GraphQL 主机交互。我正在使用 QNetworkRequest,登录过程完成得很好,给了我一个 JSON 格式的 token。从那时起,GraphQL 期望 token 位于 HTTP header 中:

{
"Authorization": "Bearer <token>"
}

测试服务器,我写了一小段 Python 代码,运行良好:

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 中执行相同的操作:

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

但是,服务器返回一个内部服务器错误 (500)

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

  • 如何让Qt正确发送这个header?

  • 我不知道它是否有帮助,但我使用 WireShark 检查了数据包。 Python 为该请求生成的数据包是一个数据包(大约 750 字节),尽管 Qt 请求被分成两个数据包,第一个数据包的长度为 600 字节。

工作包:

...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 生成的包:

....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....

.e..query=%7BfieldQueries%7Bfields(useId:%22xxx%22)%7BfieldName fieldID%7D%7D%7D

最佳答案

Graphql accepts都是 POST 和 GET 请求。因此,我没有使用 post,而是使用了 GET。它将查询作为 URL 的一部分发送,而不是 header ,从捕获的数据包中我意识到它们是作为正文发送的。解决方法如下:

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

关于qt - 带标题的 QNetworkRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55847720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com