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 请求

如何恢复 QNetworkAccessManager

QNetworkAccessManager - 如何发送 MultiPart “PATCH” 请求

QNetworkAccessManager 不发出完成信号

如何使用 QNetworkAccessManager 发送 DELETE 请求?

如何从一个 QNetworkAccessManager 发送回复?