Web Service接口通信
一,通信背景及通信方式
临时加急项目,需要将测试数据传给系统实现产品追踪。前面从未使用asmx接口传送数据,在实习期间使用QT的get方式获取过网络上的天气情况,网络通信除了使用get方式还有post方式,get方式适合携带少量数据,post方式可以携带大量数据,这和网页切换携带数据或表单提交数据一样;因为是传输测试数据,所以选用了post方式。
二,asmx接口格式
接收数据系统后台会设计好数据的格式,所以在发送时就需要将测试数据拼接成对应格式,总体发送可能是字符串,也可能是JSON数据;我用到的是字符串,但字符串中是有三个参数,参数是JSON数据,前两个参数为了区分需要通过什么方式解析接收到的数据;这便于系统后台好解析。
三,通信基本设置
QNetworkRequest request;
QNetworkAccessManager* naManager = new QNetworkAccessManager(this);
request.setUrl(QUrl("http://接口地址.asmx/EAPtoMES"));
request.setRawHeader("Host","eap2mes");
request.setRawHeader("Content-Type","application/x-www-form-urlencoded"); //基础设置
request.setRawHeader("Content-Length",QString(data.size()).toUtf8());//设置发送数据大小
四,发送数据
QJsonObject MES_init;
QJsonDocument MES_init_check;
MES_init.insert("EventID","MES_Check"); //普通JSON数据
MES_init.insert("EventID1","MES_Check"); //普通JSON数据
MES_init_check.setObject(MES_init); //json对象
QByteArray byte_init = MES_init_check.toJson(QJsonDocument::Compact); //序列化
QString MES_check ="aaa=MES_Check&"+
QString("bbb=%1&").arg(bbb)+
QString("ccc=%1").arg(QString(byte_init));//携带三个参数
QByteArray data= MES_check.toUtf8();
//发送数据
QNetworkReply* MES_check_result = naManager->post(request,data);
//监听系统返回信息
QObject::connect(naManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*)));
五,接收数据
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if(statusCode.isValid())
{
qDebug() << "http状态 =" << statusCode.toInt();
}
QNetworkReply::NetworkError err = reply->error();
if(err != QNetworkReply::NoError) //请求失败
{
qDebug() << "Failed: " << reply->errorString();
}
else
{
QString bytes = reply->readAll();
QJsonParseError err;
QJsonDocument json = QJsonDocument::fromJson(bytes.toUtf8(),&err);
QJsonObject obj = json.object();
QJsonValue jsondata= obj.take("json"); //需要查看的json数据
}