POST请求在Qt5中发送JSON文件

时间:2016-11-26 11:54:30

标签: c++ json post qt5

在Qt5的帮助下,将一个JSON文件发送到带有POST请求的服务器有一点问题。我给你一个我的程序:

#include <iostream>
#include <QCoreApplication>
#include <QFile>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>
#include <QCommandLineParser>

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);

  QByteArray jsonDocument("{}");

  QUrl url("http://validate.jsontest.com/?json=");
  QNetworkRequest request(url);
  request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

  QNetworkAccessManager manager;
  QNetworkReply* reply = manager.post(request, jsonDocument);

  while(!reply->isFinished()) {
    a.processEvents();
  }

  std::cout << "Ok, Server response : " << response.toStdString() << std::endl;

  return 0;
}

由于这不能在我必须发送文件的服务器上运行,因此我在测试服务器上测试了我的代码,例如valide.jsontest.com - &gt;当你将json发送到服务器时,它会回答你的json是否有效。

但是根据我的实际代码,我收到了这个:

Ok, Server response : {
  "error": "A JSONObject text must begin with '{' at 1 [character 2 line 1]",
   "object_or_array": "object",
   "error_info": "This error came from the org.json reference parser.",
   "validate": false
}

所以如果我发送与Curl相同的最小json对象{}:

curl -X POST -d "json={}"  http://validate.jsontest.com

答案在逻辑上很好:

{
   "object_or_array": "object",
   "empty": true,
   "parse_time_nanoseconds": 10874,
   "validate": true,
   "size": 0
}

我想我错过了我的Qt代码或POST请求机制中的一段理解。

1 个答案:

答案 0 :(得分:0)

(代表OP发布)

服务器通过特定参数请求发送json文件。例如,我必须使用参数“json”在http://www.jsontest.com/服务器上发送JSON文件。所以我的要求必须是这样的:

QByteArray jsonDocument("json={\"jsonrpc\": \"2.0\", \"method\": \"subtract\", \"params\": {\"minuend\": 42, \"subtrahend\": 23}, \"id\": 3}");

此外,我不得不替换:

request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

由:

request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

现在,一切都很好:)