json - 在 Qt 4.7 中发布 JSON 请求

标签 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 构建的,因此我必须使用库 qj​​son4-master)。不知道有没有人可以帮我解决这个问题。

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

最佳答案

您以错误的方式计算ContentLengthHeader:

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

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

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 header ,当您未指定 header 时,Qt 会为您添加此 header ,请参阅实现 here 。因此,您可以省略添加此 header 的行。


I want to get the status "200" from the server. How can I get that number ?

在您的 serviceRequestFinish 插槽中,使用 QNetworkReply::attribute() :

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

如果您的请求没问题,这应该打印 200

关于json - 在 Qt 4.7 中发布 JSON 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40372376/

相关文章:

javascript - 如何从 JSON 到 JS 获取键的值?

c++ - 如何在 openGL 中获取同质屏幕空间坐标

javascript - insertAdjacentHTML 无法读取 null 的属性

javascript - 跨多个页面的草坪椅

ios - 什么是 kCFErrorDomainCFNetwork Code=303

c++ - C++/Qt 发行版中的库链接

java - 使用 JNI 将字符串从 Java 传递到 C++

javascript - 操作后 Ember 更新模型

c++ - 在 Qt Valgrind Function Profiler 中跳过代码

c++ - Qt5.5中的QOpenGLWidget渲染QImage文件