Qt天气预报系统之HTTP

一、HTTP概述

HTTP:超文本传输协议(HyperText Transfer Protocol)

HTTP 是浏览器端web通信的基础

1、两种架构

B/S架构:Browser/Server,浏览器/服务器架构

B:浏览器,比如 Firefox、Internet Explorer、Google Chrome、Safari、Opera

S:服务器,比如 Apache、nginx

C/S架构:Client/Server,客户端/服务器架构

B/S架构相对于C/S架构,客户机上无需安装任何软件,使用浏览器即可访问服务器
因此,越来越多的C/S架构正被B/S架构所替代

2、基于请求的模式

HTTP协议永远都是客户端发起请求,服务器做出响应

这就无法实现一种场景:服务端主动推送消息给客户端

3、无状态

当浏览器第一次发送请求给服务器时,服务器做出了响应;
当浏览器第二次发送请求给服务器时,服务器同样可以做出响应,但服务器并不知道第二次的请求和第一次来自同一个浏览器
也就是说,服务器是不会记住你是谁的,所以是无状态的。


而如果要使HTTP协议有状态,就可以使浏览器访问服务器时,加入 cookie
这样,只要你在请求时有了这个 cookie,服务器就能够通过 cookie 知道,你就是之前那个浏览器
这样的话,http 协议就有状态了。

4、请求报文

请求报文由四部分组成:

请求行 + 请求头(请求首部字段) + 空行 + 实体

  • 请求行 

        请求方法:GET、POST

        资源对象(URI

        协议名称和版本号(HTTP/1.1)

  • 请求头 

  • 空行

        目的:区分请求头和请求实体

  • 请求实体

        即真正需要传输的数据

5、响应报文

组成

状态行 + 响应头 + 空行 + 消息体

  • 状态行 

        HTTP版本

        状态码(表示相应的结果)

        原因短语(解释)

  • 响应头(响应报文首部)

  • 空行

        目的:区别响应实体和响应首部

  • 消息体

        真正存储响应信息的部分

6、请求方式

HTTP常用的请求方式有很多中,最常用的是GET和POST
二者最主要的区别就是:

  • GET请求的参数位于URL中,会显示在地址栏上
  • POST请求的参数位于 request body 请求体中。

因此,GET请求的安全性不如POST请求,并且GET请求的参数有长度限制,而 POST没有

二、Postman

Postman是一个接口测试工具,主要用于模拟各种HTTP请求(比如GET、POST等);在做接口测试时,Postman就相当于客户端

安装

Postman下载地址根据自己的系统下载对应的版本(通常时最新的)

点击Windows的图标下载

傻瓜式下一步下一步安装完后,我们暂时不需要注册账号,点击左下角的skip忽略

发送请求

以获取北京的天气为例:

北京的URL为http://t.weather.itboy.net/api/weather/city/101010100

其中101010100是北京的编号

三、Qt实现HTTP请求

1、创建网络对象

首先创建QNetworkAccessManager对象,这是Qt中进行HTTP请求的开端

mNetAccessManager = new QNetworkAccessManager(this)

2、关联信号槽

发送请求之前,需要先关联信号槽

获取到数据之后

connect(mNetAccessManager,&QNetworkAccessManager::finished, this ,

                                                                            &MainWindow::onReplied)

当请求结束,获取到服务器的数据时, mNetAccessManager会发射一个finished信号,该信号携带一个QNetworkReply的参数

服务器返回的所有数据就封装在其中,通过QNetworkReply类提供的各种方法,就可以获取响应偷、响应体等各种数据

3、发送请求

QUrl  url(http://t.weather.itboy.net/api/weather/city/101010100);   //构建url地址

mNetAccessManager -> get(QNetworkRequest(url));   

根据请求的地址构建出一个QUrl对象,然后直接调用QNetworkAccessManagerget方法,,即可发送一个GET请求 

4、接受数据

当绑定信号槽以后,服务器返回数据会自动调用我们的自定义槽函数onReplied

下面是onReplied的写法:

void Mainwindow:: onReplied(QNetworkReply* reply)
{

        //响应的状态码为200,表示请求成功
        int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();


        qDebug() << "operation:" << reply->operation();                   // 请求方式
        qDebug() << "status code:" << status_code;                        // 状态码
        qDebua0 << "url:" << reply->url();                                         // url
        qDebug)<< "raw header:" << reply->rawHeaderList();         // header

        if ( reply->error() != QNetworkReply::Noerror || status_code != 200 ){
                QMessageBox::warning(this,"提示","请求数据失败!",QMessageBox::0k);
        }else {
                //获取响应信息
                QByteArray reply_data = reply->readAll();
                QByteArray bytearray =QString(reply_data).toUtf8();
                qDebug() << "read all:" << byteArray.data();

                //parseJson()
        }
        reply->deleteLater ();

}

由此可见,QNetworkReply中封装了服务器返回的所有数据,包括响应头、状态码、响应体等。

  • 21
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值