用Qt实现基于网络请求的用户登录(一)

来源:互联网 发布:源生活网络超市 编辑:程序博客网 时间:2024/06/07 07:29

待解决的问题

  • 问题:用户联网登录
    1.提供登录界面(客户端),输入用户名和密码;
    2.将用户名和密码发送给服务器端,并进行相关查询,如果用户合法,返回用户信息;
    3.对返回的用户信息进行解析。
  • 假设:
    已经有了服务器和存储着用户名和密码数据库。服务器当接收到客服端的请求的时候,先在数据库中进行查询操作,然后返回用户信息。
    所以本文要实现的只是客户端请求信息的配置和对返回信息的解析。

涉及的知识点

  • 网络请求的基础知识
  • Json

需要解决的技术问题:

  • 在qt中如何设置网络请求
  • 在qt中如何生成和解析Json数据

一、网络请求的基础知识(暂略)

二、Qt中与网络请求相关类介绍

  • QNetworkAccessManager -

    Allows the application to send network requests and receive replies

  • QNetworkRequest

    Holds a request to be sent with QNetworkAccessManager

  • QNetworkReply

    Contains the data and headers for a request sent with QNetworkAccessManager

关系图:
这里写图片描述
(参考资料:http://blog.csdn.net/chenlong12580/article/details/7392766)
我的理解是:QNetworkRequest设置网络请求的各个参数,QNetworkReply用于接收服务器返回的数据。而QNetworkAccessManager充当着一个中介的作用,设置post、get等方式将request发出去,然后监测服务器是否返回数据(存在QNetworkReply中),并将返回得来的reply委托给一个slot处理。
所以当进行网络请求的时候,要做的事情:

  1. 生成QNetworkRequest对象,设置请求头、请求所用API所需实参、url等信息;
  2. 准备解析处理QNetworkReply的slot;
  3. 生成QNetworkAccessManager,发送request,并将返回来的reply委托给该slot处理(实现上就是一条connect语句)

三、QJson的生成与解析

请先阅读:
http://www.w3school.com.cn/json/index.asp
http://www.w3school.com.cn/json/json_syntax.asp
无论是设置request所需的参数信息,还是返回来的reply,其数据均采用QJson的形式表示,所以要实现网络请求,QJson的生成和解析重要。
QJson是一个基于Qt的开发包用来将JSON数据解析成QVariant对象,JSON的数组将被映射为QVariantList实例,而其他对象映射为QVariantMap实例。
(一)与QJson相关的类

  • QJsonDocument

The QJsonDocument class provides a way to read and write JSON documents. QJsonDocument is a class that wraps a complete JSON document and can read and write this document both from a UTF-8 encoded text-based representation as well as Qt’s own binary format.

我的理解:text-based representation 应该是指形如[“Qt”,”version”,true]的表现形式,而这个整体就是一个基于text-based representation的JSON document了。这个整体在Qt中可以被存储在QByteArray中。QJsonDocument则是Qt中对JSON document进行读写的工具。

A document can be queried as to whether it contains an array or an object using isArray() and isObject(). The array or object contained in the document can be retrieved using array() or object() and then read or manipulated.

这里对应着Json中数组和对象的概念。相应地,Qt中提供与对象、数组相关的两个类:

  • QJsonObject

The QJsonObject class encapsulates a JSON object.A JSON object is a list of key value pairs, where the keys are unique strings and the values are represented by a QJsonValue.
You can convert the object to and from text based JSON through QJsonDocument.

  • QJsonArray

The QJsonArray class encapsulates a JSON array.A JSON array is a list of values. The list can be manipulated by inserting and removing QJsonValue’s from the array.You can convert the array to and from text based JSON through QJsonDocument.

这些类之间的关系可以表示如下:
这里写图片描述

上面介绍了Qt中与Json有关的一些类以及它们之间的关系,那么具体如何利用这些类来生成和解析Json呢?注意到,Qt的帮助文档中提到,无论是对QJsonObject而言,还是对QJsonArray而言,他们均可通过QJsonDocument与Json document进行转换。
下面就分别基于QJsonObject和QJsonArray介绍这些类的使用方法。下面使用的代码均来自http://blog.sina.com.cn/s/blog_a6fb6cc90101gnxm.html。
代码理解:
1.展示了如何通过QJsonDocument使得QJsonObject、QJsonArray与Json document之间转换;
2. Json document 由QByteArray或者QString来表示;
3. QJsonParseError用于解析

(二)基于QJsonObject的Json生成与解析

1.生成Json

QJsonObject json;json.insert("name", QString("Qt"));json.insert("version", 5);json.insert("windows", true);QJsonDocument document;document.setObject(json);QByteArray byte_array = document.toJson(QJsonDocument::Compact);QString json_str(byte_array);

结果:

json_str为: {"name": "Qt","version": 5,"windows": true}

2.解析Json

QJsonParseError json_error;QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error); if(json_error.error == QJsonParseError::NoError) {      if(parse_doucment.isObject())      {          QJsonObject obj = parse_doucment.object();         if(obj.contains("name"))          {      QJsonValue name_value = obj.take("name");    if(name_value.isString())    {        QString name = name_value.toString();    }} if(obj.contains("version"))  {      QJsonValue version_value = obj.take("version");    if(version_value.isDouble())    {int version = version_value.toVariant().toInt();    }} if(obj.contains("windows")){    QJsonValue version_value = obj.take("windows");    if(version_value.isBool())    {bool flag = version_value.toBool();    } }    }  }  

结果:

name:Qtversion5windows:true

(三)基于QJsonArray的的Json生成与解析
1.生成Json

QJsonArray json;json.insert(0, QString("Qt"));json.insert(1, QString("version"));json.insert(2, true);QJsonDocument document;document.setArray(json);QByteArray byte_array = document.toJson(QJsonDocument::Compact);QString json_str(byte_array);

结果:

json_str:["Qt","version",true]

2.解析Json

QJsonParseError json_error;QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error); if(json_error.error == QJsonParseError::NoError) {      if(parse_doucment.isArray())      {  QJsonArray array = parse_doucment.array(); int size = array.size();for(int i=0; i        {    QJsonValue value = array.at(i);    if(value.isString())    {QString name = value.toString();    }    else if(value.isBool())    {bool flag = value.toBool();    }}    }}

结果:

数组不同下标对应的值0:Qt1version2true
阅读全文
0 0
原创粉丝点击