QNetworkAccessManager HTTP Put 请求不起作用
Posted
技术标签:
【中文标题】QNetworkAccessManager HTTP Put 请求不起作用【英文标题】:QNetworkAccessManager HTTP Put request not working 【发布时间】:2021-12-15 14:44:15 【问题描述】:在网上对这个问题进行了详尽的搜索后,找到的答案都没有解决它。
使用Qt_5_15_2_MSVC2019_64/Microsoft Visual C++ Compiler技术, 我正在尝试通过来自 QNetworkAccessManager 的 HTTP put 请求将 JSON 文件发送到自定义 QTcpServer,但是这样做时,只接收到 HTTP 标头(甚至两次),而不是 JSON 文件本身。
片段代码:
void Sender::putParameters(const QString& p_parameters)
QJsonDocument docJson = QJsonDocument::fromJson(p_parameters.toUtf8());
QByteArray data = docJson.toJson();
QUrl url= QUrl("http://127.0.0.1:80/api/devices/1285/parameters");
QNetworkAccessManager* nam = new QNetworkAccessManager(this); // Even tried to put as member variable but still did not work
QNetworkRequest networkReq(url);
networkReq.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
networkReq.setRawHeader("Content-Length", QByteArray::number(data.size()));
QObject::connect(nam, &QNetworkAccessManager::finished, this,
&Sender::validateParameters);
nam->put(networkReq, data);
if(docJson.isEmpty())
qDebug() << "JSON was empty";
结果 QTcpServer:
使用 Poco 库没有问题,它可以正常工作,或者通过 Postman 发送 HTTP put 请求也可以正常工作。
【问题讨论】:
你能分享你的 QTcpServer 的代码来打印你所描绘的结果吗?想知道您是否未正确检索收据端的请求数据。 将 json 从 UTF-8 字符串解析为QJsonDocument
并在将其序列化回 UTF-8 编码字节数组之后的目的是什么?如果您打算检查输入 json 字符串的有效性,那么您实际上并没有这样做:QJsoDocument::fromJson
如果解析失败但您不通过调用 QJsonDocument::isNull()
进行检查,则返回 null QJsonDocument
。可能是您的输入 json 无效,因此序列化 null QJsonDocument
会产生一个空字符串。
【参考方案1】:
@dabbler
抱歉,回答迟了,但这里是服务器的代码 sn-p : enter image description here
使用 postMan 和 Poco 它运行良好,所以我不知道问题是否与服务器有关,对于客户端@Dmitry 你是对的我应该使用 QJsonDocument::isNull 代替(但我使用isEmpty() 只是为了演示目的,我没有发送无效的 Json,事实并非如此,json 是有效的)。
【讨论】:
如果您要发布答案,请使用代码并使用格式选项。代码截图没有用,因为用户无法复制/粘贴或运行它进行调试。【参考方案2】:是的,我的坏@Syfer
所以我有继承自 QTcpServer 的类 Server 并覆盖函数incomingConnection 例如:void incomingConnection(qintptr) Q_DECL_OVERRIDE;
这里是sn-p的代码:
Server::Server(QObject* parent) : QTcpServer(parent)
if(listen(QHostAddress::Any, 80))
qDebug() << "Ok listening port 80";
else
qCritical() << "Fail listening";
void Server::incomingConnection(qintptr p_intPtrSocket)
QTcpSocket* socketClient = new QTcpSocket(this);
socketClient->setSocketDescriptor(p_intPtrSocket);
connect(socketClient, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
void Server::onReadyRead()
QTcpSocket* socketClient = (QTcpSocket*)sender();
QString fullClientRequest = QString::fromUtf8(socketClient->readAll());
QStringList clientReq = fullClientRequest.split("\n");
qDebug() << "client response: " << clientReq;
【讨论】:
以上是关于QNetworkAccessManager HTTP Put 请求不起作用的主要内容,如果未能解决你的问题,请参考以下文章
QNetworkAccessManager - 如何发送 MultiPart “PATCH” 请求