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/下载