查看完整版本: [-- HTTP访问并获取返回的json数据使用QJson解析的函数 --]

QTCN开发网 -> Qt代码秀 -> HTTP访问并获取返回的json数据使用QJson解析的函数 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

XChinux 2013-03-26 10:54

HTTP访问并获取返回的json数据使用QJson解析的函数

Fn.hpp文件,声明了Fn::call()函数,config静态成员用于保存一些配置信息
  1. #ifndef FN_HPP
    #define FN_HPP

    #include <QtCore/QVariantMap>

    class Fn
    {
    public:
        static QVariantMap call(const QString &url,
                const QVariantMap &param = QVariantMap());
        static QVariantMap config;
    };

    #endif



Fn.cpp文件,call()函数中url为请求网址,param为POST的数据,会将其转换为json格式再POST出去。
返回值为result,如果出错,则result["error"]中放错误信息。如果是application/json格式,则用QJson库解析数据万QVariantMap格式,否则将数据放到 result["data"]中。

  1. #include <QtCore>
    #include <QtNetwork>
    #include "qjson/parser.h"
    #include "qjson/serializer.h"
    #include "Fn.hpp"

    QVariantMap Fn::config;

    QVariantMap Fn::call(const QString &url, const QVariantMap &param)//{{{
    {
        static QNetworkAccessManager manager;
        QNetworkReply *reply;
        {
            QJson::Serializer serializer;
            QByteArray baJson = serializer.serialize(param);
            qDebug() << "[HTTP REQUEST]\t" << url << "\n\t\t\t" << baJson;

            QNetworkRequest req;
            QString strUrl = url;
            if (strUrl.left(7) != "http://")
            {
                strUrl = Fn::config["urlprefix"].toString() + url;
            }
            req.setUrl(QUrl(strUrl));
            req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
            req.setHeader(QNetworkRequest::ContentLengthHeader, baJson.length());

            reply = manager.post(req, baJson);
        }
        QEventLoop *loop = new QEventLoop();
        QObject::connect(reply, SIGNAL(finished()), loop, SLOT(quit()));
        loop->exec();
        delete loop;

        QVariantMap result;
        if (reply->error() != QNetworkReply::NoError)
        {
            result["error"] = QString("[REQUEST ERROR]\tCode %1:%2")
                .arg(reply->error())
                .arg(reply->errorString());
            qDebug() << result["error"].toString();

        }
        else if (reply->header(QNetworkRequest::ContentTypeHeader).toString()
                != "application/json")
        {
            qDebug() << reply->header(QNetworkRequest::ContentTypeHeader);
            result["data"] = reply->readAll();
            qDebug() << "[HTTP RECEIVED]\t" << result["data"].toByteArray();
        }
        else
        {
            qDebug() << reply->header(QNetworkRequest::ContentTypeHeader);
            QByteArray ba = reply->readAll();
            qDebug() << "[HTTP RECEIVED]\t" << ba;

            QJson::Parser parser;
            bool ok;
            result = parser.parse(ba, &ok).toMap();
            if (!ok)
            {
                result["error"] = QString("[PARSER ERROR]\tLine %1:%2")
                    .arg(parser.errorLine())
                    .arg(parser.errorString());
                qDebug() << result["error"].toString();
            }
        }
        delete reply;
        return result;
    }//}}}


关于qjson,可到http://qjson.sourceforge.net/下载

xzoscar 2013-04-10 15:10
已 拜读,顶贴

it小鸟 2013-07-06 23:31
我在做访问并获取一个xml原理应该和这个差不多吧?!

wxy540689 2016-08-19 13:58

hunterzf 2016-11-21 17:31
回去试试,谢谢楼主

hunterzf 2017-03-25 22:42
谢谢楼主,辛苦了

林慧 2018-01-17 21:23
Qt4版本怎么安装json呢?



查看完整版本: [-- HTTP访问并获取返回的json数据使用QJson解析的函数 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled