Qt 中实现RPC 请求( POST + JSON )

RPC 通讯方式简而言之就是一个 http 请求返回的过程,客户端发起一次 http 的 post 请求,请求参数用标准的 JSON 格式封装在请求包中,服务端收到这个请求包后解析出参数 JSON 中的内容,作出相应的处理后将需要的数据封装成JSON格式在http 返回包中,客户端即可收到请求的结果。这个过程理论上与通过http 访问某个URL 页面(地址)得到这个地址返回的文字信息没有区别。

这里重点在于 

 1. 在QT 中实现POST 请求;

 2. 在 QT 中实现对 JSON 的封装。

 3. 如何在POST 中发送一个JSON 格式的参数。

#ifndef GCJSONRPC_H
#define GCJSONRPC_H
#include <QObject>
#include <QString>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>

#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>


class GCJsonRPC : public QObject{

    Q_OBJECT

private:
    
    QString actionResult = "http://localhost:6800/jsonrpc";
    QNetworkAccessManager* manager = Q_NULLPTR;

public:

    GCJsonRPC();    

    void SendMessage(  QString jsonrpc ,QString id ,QString method, QJsonArray params );

public slots:

    void GCNetworkReply( QNetworkReply* reply, const QString id );

};

#endif // GCJSONRPC_H



#include "gcjsonrpc.h"
#include <QProcess>


GCJsonRPC::GCJsonRPC()
{

}


void GCJsonRPC::SendMessage( QString jsonrpc ,QString id ,QString method, QJsonArray params )
{

    qDebug() << "======================= SendMessage === "+ method +" =================================== ";

    QNetworkAccessManager *manager = new QNetworkAccessManager();

    QJsonObject obj;

    obj.insert("jsonrpc", jsonrpc );
    obj.insert("id", id );
    obj.insert("method", method );

    if ( ! params.isEmpty() ){

        obj.insert("params", params );
    }

    QNetworkRequest *request = new QNetworkRequest;
    request->setUrl(QUrl( actionResult ) );

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

    QNetworkReply  *UU = manager->post( *request, QJsonDocument( obj ).toJson() );
    
    QObject::connect( manager,
             &QNetworkAccessManager::finished,
             this,
             [=](QNetworkReply* reply){

                 this->GCNetworkReply(reply, method );
                 manager->deleteLater();
                 manager->destroyed();
             });
    
}


void GCJsonRPC::GCNetworkReply( QNetworkReply* reply,const QString method ){

      qDebug() << "======================= GCNetworkReply === "+ method +" ================================ ";

       if( reply->error() != QNetworkReply::NoError ){

           qDebug() << "Error:" << reply->errorString();
           aria2c_rpc_msg->ReturnError( reply->errorString() );

       }else{

           QByteArray buf = reply->readAll();
           qDebug() << "OK:"<< buf;

           QJsonDocument rmsgobj = QJsonDocument::fromJson( buf );
           QJsonObject rconsole = rmsgobj.object();

           if ( !rconsole.isEmpty()  ){

               /**
               * 回调返回消息分发
               */
               

           }else{

              qDebug() <<"非标准 JSON 格式返回";
           }

       }
       //this->deleteLater();
}