• 12041阅读
  • 6回复

HTTP访问并获取返回的json数据使用QJson解析的函数 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2013-03-26
关键词: QJsonHTTP
Fn.hpp文件,声明了Fn::call()函数,config静态成员用于保存一些配置信息
  1. #ifndef FN_HPP
  2. #define FN_HPP
  3. #include <QtCore/QVariantMap>
  4. class Fn
  5. {
  6. public:
  7.     static QVariantMap call(const QString &url,
  8.             const QVariantMap &param = QVariantMap());
  9.     static QVariantMap config;
  10. };
  11. #endif



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

  1. #include <QtCore>
  2. #include <QtNetwork>
  3. #include "qjson/parser.h"
  4. #include "qjson/serializer.h"
  5. #include "Fn.hpp"
  6. QVariantMap Fn::config;
  7. QVariantMap Fn::call(const QString &url, const QVariantMap &param)//{{{
  8. {
  9.     static QNetworkAccessManager manager;
  10.     QNetworkReply *reply;
  11.     {
  12.         QJson::Serializer serializer;
  13.         QByteArray baJson = serializer.serialize(param);
  14.         qDebug() << "[HTTP REQUEST]\t" << url << "\n\t\t\t" << baJson;
  15.         QNetworkRequest req;
  16.         QString strUrl = url;
  17.         if (strUrl.left(7) != "http://")
  18.         {
  19.             strUrl = Fn::config["urlprefix"].toString() + url;
  20.         }
  21.         req.setUrl(QUrl(strUrl));
  22.         req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
  23.         req.setHeader(QNetworkRequest::ContentLengthHeader, baJson.length());
  24.         reply = manager.post(req, baJson);
  25.     }
  26.     QEventLoop *loop = new QEventLoop();
  27.     QObject::connect(reply, SIGNAL(finished()), loop, SLOT(quit()));
  28.     loop->exec();
  29.     delete loop;
  30.     QVariantMap result;
  31.     if (reply->error() != QNetworkReply::NoError)
  32.     {
  33.         result["error"] = QString("[REQUEST ERROR]\tCode %1:%2")
  34.             .arg(reply->error())
  35.             .arg(reply->errorString());
  36.         qDebug() << result["error"].toString();
  37.     }
  38.     else if (reply->header(QNetworkRequest::ContentTypeHeader).toString()
  39.             != "application/json")
  40.     {
  41.         qDebug() << reply->header(QNetworkRequest::ContentTypeHeader);
  42.         result["data"] = reply->readAll();
  43.         qDebug() << "[HTTP RECEIVED]\t" << result["data"].toByteArray();
  44.     }
  45.     else
  46.     {
  47.         qDebug() << reply->header(QNetworkRequest::ContentTypeHeader);
  48.         QByteArray ba = reply->readAll();
  49.         qDebug() << "[HTTP RECEIVED]\t" << ba;
  50.         QJson::Parser parser;
  51.         bool ok;
  52.         result = parser.parse(ba, &ok).toMap();
  53.         if (!ok)
  54.         {
  55.             result["error"] = QString("[PARSER ERROR]\tLine %1:%2")
  56.                 .arg(parser.errorLine())
  57.                 .arg(parser.errorString());
  58.             qDebug() << result["error"].toString();
  59.         }
  60.     }
  61.     delete reply;
  62.     return result;
  63. }//}}}


关于qjson,可到http://qjson.sourceforge.net/下载
附件: qjson-0.7.1.zip (1255 K) 下载次数:159
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线xzoscar
只看该作者 1楼 发表于: 2013-04-10
已 拜读,顶贴
XZoscar@163.com
QQ,351565950
南京
离线it小鸟

只看该作者 2楼 发表于: 2013-07-06
我在做访问并获取一个xml原理应该和这个差不多吧?!
离线wxy540689

只看该作者 3楼 发表于: 2016-08-19
离线hunterzf

只看该作者 4楼 发表于: 2016-11-21
回去试试,谢谢楼主
离线hunterzf

只看该作者 5楼 发表于: 2017-03-25
谢谢楼主,辛苦了
离线林慧

只看该作者 6楼 发表于: 2018-01-17
Qt4版本怎么安装json呢?

快速回复
限100 字节
 
上一个 下一个