在Qt 4.7中发布JSON请求

时间:2016-11-02 04:14:14

标签: json qt

我正在开展一个项目,要求我将JSON请求发布到API服务器,然后从服务器接收数据。但是我不能让它发挥作用。这是我的代码

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QUrl serviceUrl = QUrl("https://www.jusmine.jp/KA/KGBloginCheck");
    QNetworkRequest request(serviceUrl);
    QJsonObject json;
    json.insert("userid","xxxx");
    json.insert("userpass","xxxx");     
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
    request.setHeader(QNetworkRequest::ContentLengthHeader,QByteArray::number(json.size()));
    QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
    connect(networkManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(serviceRequestFinish(QNetworkReply*)));
    networkManager->post(request,QJsonDocument(json).toJson());
}
void MainWindow::serviceRequestFinish(QNetworkReply *rep)
{
    QString strReply = (QString)rep->readAll();
    qDebug()<<"Test: "<<strReply;
}

运行程序后,我从服务器上得不到任何东西。 (此代码基于Qt 4.7.0构建,因此我必须使用库qjson4-master)。我不知道是否有人可以帮我解决这个问题。

这是测试服务器API的结果: screenshot

1 个答案:

答案 0 :(得分:3)

您正在以错误的方式计算ContentLengthHeader

request.setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(json.size()));

请注意QJsonObject::size()返回对象中存储的(键,值)对的数量(不是其文本表示的长度)。显然,标题应该等于内容的长度而不是它的(键,值)对的数量。

MainWindow构造函数中的代码应如下所示:

QUrl serviceUrl = QUrl("https://www.jusmine.jp/KA/KGBloginCheck");
QNetworkRequest request(serviceUrl);
QJsonObject json;
json.insert("userid","xxxx");
json.insert("userpass","xxxx");     
QJsonDocument jsonDoc(json);
QByteArray jsonData= jsonDoc.toJson();
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
request.setHeader(QNetworkRequest::ContentLengthHeader,QByteArray::number(jsonData.size()));
QNetworkAccessManager networkManager;
connect(networkManager, SIGNAL(finished(QNetworkReply*)),
        this, SLOT(serviceRequestFinish(QNetworkReply*)));
networkManager.post(request, jsonData);

旁注:无需自行计算Content-Length标头,当您没有指定时,Qt会为您添加此标头,请参阅实施here。因此,您可以省略添加此标题的行。

  

我想获得状态&#34; 200&#34;从服务器。我怎么能得到那个号码?

serviceRequestFinish广告位中,使用QNetworkReply::attribute()

qDebug() << rep->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

如果您的请求正常,则应打印200