XChinux |
2013-03-26 10:54 |
HTTP访问并获取返回的json数据使用QJson解析的函数
Fn.hpp文件,声明了Fn::call()函数,config静态成员用于保存一些配置信息
- #ifndef FN_HPP
#define FN_HPP
#include <QtCore/QVariantMap>
class Fn { public: static QVariantMap call(const QString &url, const QVariantMap ¶m = QVariantMap()); static QVariantMap config; };
#endif
Fn.cpp文件,call()函数中url为请求网址,param为POST的数据,会将其转换为json格式再POST出去。 返回值为result,如果出错,则result["error"]中放错误信息。如果是application/json格式,则用QJson库解析数据万QVariantMap格式,否则将数据放到 result["data"]中。
- #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 ¶m)//{{{ { 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/下载
|
|