C++ 使用QT发送POST请求并读取Json响应

C++ 使用QT发送POST请求并读取Json响应,c++,json,qt,C++,Json,Qt,我是QT开发的新手。我试图对rest服务执行一个简单的Post请求,以便读取Json数据 目前我写了: void LoginWindow::on_pushButton_clicked(){ // Setup the webservice url QUrl serviceUrl = QUrl("http://urlrestservice.com"); QByteArray postData; postData.append("request=userdata&am

我是QT开发的新手。我试图对rest服务执行一个简单的Post请求,以便读取Json数据

目前我写了:

void LoginWindow::on_pushButton_clicked(){
    // Setup the webservice url
    QUrl serviceUrl = QUrl("http://urlrestservice.com");

    QByteArray postData;
    postData.append("request=userdata&");
    postData.append("user=myusername&");
    postData.append("password=mypasswod");

    // Call the webservice
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);

    //QNetworkRequest::setHeader();
    QNetworkRequest request(serviceUrl);
    request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant( 
    QString("text/xml")));

   connect(manager, SIGNAL(finished(QNetworkReply*)), this, 
    SLOT(serviceRequestFinished(QNetworkReply*)));
    manager->post(request, postData);
}
从那以后我就不知道该怎么办了。我做了一个空方法

void LoginWindow::serviceRequestFinished(QNetworkReply* reply){ }
但我不知道他们的内心是怎样的

Post请求应返回给我:

{
    "response": {
    "status": "200",
    "message": "Correct request"
},
"data": [
    [
        {
            "href": "link",
            "text": "string matr"
        },
        {
            "href": "link",
            "text": "string type"
        },
        {
            "href": "link",
            "text": "string name"
        },
        {
            "href": "link",
            "text": "string state"
        }
    ]

]
}

我已经读到存在一个库QJson,但我认为官方文档有点混乱,我不知道如何继续。

到目前为止似乎还可以,接下来您应该向ServiceRequistFinished添加一些代码

#include <QNetworkReply>
#include <QJsonValue>
#include <QJsonValueRef>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>


void LoginWindow::serviceRequestFinished(QNetworkReply* reply){
    QByteArray buffer = reply->readAll();
    qDebug() << buffer;
    QJsonDocument jsonDoc(QJsonDocument::fromJson(buffer));
    QJsonObject jsonReply = jsonDoc.object();

    QJsonObject response = jsonReply["response"].toObject();
    QJsonArray  data     = jsonReply["data"].toArray();
    qDebug() << data;
#包括
#包括
#包括
#包括
#包括
#包括
void loginWindows::serviceRequestFinished(QNetworkReply*reply){
QByteArray buffer=reply->readAll();

qDebug()您的处理程序可能如下所示:

void SyncthingConnection::readConfig()
{
    auto *const reply = static_cast<QNetworkReply *>(sender());
    reply->deleteLater();

    switch (reply->error()) {
    case QNetworkReply::NoError: {
        const QByteArray response(reply->readAll());
        QJsonParseError jsonError;
        const QJsonDocument replyDoc = QJsonDocument::fromJson(response, &jsonError);
        if (jsonError.error != QJsonParseError::NoError) {
            emitError(tr("Unable to parse Syncthing config: "), jsonError, reply, response);
            handleFatalConnectionError();
            return;
        }

        m_rawConfig = replyDoc.object();
        emit newConfig(m_rawConfig);
        m_hasConfig = true;
        concludeReadingConfigAndStatus();
        break;
    }
    case QNetworkReply::OperationCanceledError:
        return; // intended, not an error
    default:
        emitError(tr("Unable to request Syncthing config: "), SyncthingErrorCategory::OverallConnection, reply);
        handleFatalConnectionError();
    }
}
void SyncthingConnection::readConfig()
{
auto*const reply=static_cast(sender());
回复->删除稍后();
开关(应答->错误(){
案例QNetworkReply::无错误:{
常量QByteArray响应(reply->readAll());
QJsonParseError jsonError;
const QJsonDocument replyDoc=QJsonDocument::fromJson(响应,&jsonError);
if(jsonError.error!=QJsonParseError::NoError){
emitError(tr(“无法解析同步配置”)、jsonError、reply、response;
HandleCatalConnectionError();
返回;
}
m_rawConfig=replyDoc.object();
emit newConfig(m_rawConfig);
m_hasConfig=true;
结论AdingConfigandStatus();
打破
}
案例QNetworkReply::操作取消错误:
return;//预期的,不是错误
违约:
emitError(tr(“无法请求Syncthing配置”)、SyncthingErrorCategory::OverallConnection、reply);
HandleCatalConnectionError();
}
}
这个例子包括网络和JSON解析的错误处理

关于使用Qt解析JSON,实际上有很多很好的文档:


还可以查看连接信号和插槽的新语法。

第一个编译器错误:
无效使用不完整的类型“class QNetworkReply”QByteArray data=reply->readAll()
我不知道如何修复。小错误:两次
#include
和两次
数据
变量声明Hi,我添加了一些include,您需要能够编译和更改重复的名称,请告诉我它是否正在工作。