2016-11-26 188 views
2

在Qt5的幫助下,通過POST請求將JSON文件發送到服務器時有點問題。我給你一張我的程序:POST在Qt5中發送JSON文件的請求

#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在測試服務器上的服務器上運行 - >當你發送一個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 
} 

所以,如果我發送相同的最小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請求的機制。

回答

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

現在,一切都很好:)