Android网络编程-HTTP/HTTPS

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,在TCP/IP体系中属于最高层(应用层)是用于从万维网服务器传输超文本到本地浏览器的传送协议。


HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
这是最基本的HTTP工作原理,如图所示:

C/S架构


HTTP报文

HTTP属于应用层,应用层传输的数据单位是报文。
HTTP报文分为请求报文和响应报文。

请求报文



请求报文


HTTP请求报文由以下4个部分组成:


请求行:请求类型,要访问的资源以及所使用的HTTP版本。请求头部:服务器要使用的附加信息。空行:请求头部后面的空行是必须的请求包体:可以添加任意的其他数据

请求行

请求行组成:请求方法,请求URL,协议版本。

请求方法



请求URL

URL(Uniform Resource Locator)统一资源定位符,表示资源的地点(互联网上的地址)。
URI(Uniform Resource Identifier)统一资源标识符,用字符串标识某一互联网资源,URL是URI的子集。

协议版本

HTTP/1.0:HTTP协议的第二个版本,第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用HTTP/1.1:HTTP协议的第三个版本是HTTP 1.1,是目前使用最广泛的协议版本HTTP/2.0:HTTP 2.0是下一代HTTP协议,目前应用还非常少

请求头部

请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。
有4种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段,所有完整首部
这里我们先了解下常用的请求首部。



请求包体

请求包体不在 GET 方法中使用,而是在POST 方法中使用。
HTTP请求的请求体有三种不同的形式:

任意类型:服务器不会解析请求体,请求体的处理需要自己解析,比如JSON键值对(application/x-www-form-urlencoded):最常见的 POST 提交数据的方式,表单模式文件分割:请求体被分成为多个部分,文件上传时会被使用

示例

使用抓包工具或者Chrome来查看

<code>POST /getconfig HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; Redmi Note 7 MIUI/V10.3.2.0.PFGCNXM)
Host: data.mistat.xiaomi.com
Accept-Encoding: gzip
Content-Length: 205
Connection: close

app_id=1000274&app_version=10.8.3/<code>请求行:显示Post请求,协议版本为HTTP/1.1请求头部:Content-Type,User-Agent,Host,Accept-Encoding,Content-Length,Connection请求体:Content-Type声明为键值对

响应报文


响应报文


HTTP 响应报文由状态行、响应头部、空行和响应包体4个部分组成。


状态行

状态行由HTTP协议版本字段、状态码和状态码的描述文本 3 个部分组成,他们之间使用空格隔开;
协议版本和请求中的对应,状态码和描述会一一对应。

状态码、描述

状态码由三位数字组成,第一位数字表示响应的类型,常用的状态码有五大类:

1xx:Informational(信息性状态码),接收的请求正在处理;2xx:Success(成功状态码),请求正常处理完毕;3xx:Redirection(重定向状态码),需要进行附加操作以完成请求;4xx:Client Error(客户端错误状态码),服务器无法处理请求;5xx:Server Error(服务器错误状态码),服务器处理请求出错;

常用的一些状态码和描述

1xx

状态码、描述说明

100 Continue表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应

2xx

状态码、描述说明200 OK请求成功204 No Content请求已经成功处理,但是返回的响应报文不包含实体的主体部分206 Partial Content表示客户端进行了范围请求,
响应报文包含由Content-Range指定范围的实体内容

3xx

状态码、描述说明301 Moved Permanently永久性重定向302 Found临时性重定向304 Not Modified如果请求报文首部包含一些条件,If-Match,If-Range,
If-Modified-Since,If-None-Match,,If-Unmodified-Since。
如果不满足条件,则服务器会返回 304 状态码307 Temporary Redirect临时重定向,与 302 的含义类似,
但是307要求浏览器不会把重定向请求的POST方法改成GET方法

4xx

状态码、描述说明400 Bad Request请求报文中存在语法错误401 Unauthorized请求需要验证用户403 Forbidden访问权限问题404 Not Found

5xx

状态码、描述说明

500 Internal Server Error服务器正在执行请求时发生错误503 Service Unavailable服务器正在执行请求时发生错误

响应头部

和请求头部一样,由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。
常用的请求首部

字段说明Cache-Control控制缓存的行为Connection控制不再转发给代理的首部字段、管理持久连接Transfer-Encoding指定报文主体的传输编码方式Content-Encoding实体主体适用的编码方式Content-Type实体主体的媒体类型Content-Length实体主体的大小Expires实体主体过期的日期时间ETag资源的匹配信息,和If-Nome-Match对应Date服务端创建报文的日期时间Location令客户端重定向至指定 URIServerHTTP 服务器的安装信息Last-Modified资源的最后修改日期时间Set-Cookie设置Cookie,客户端得到响应报文后把 Cookie 内容保存到浏览器中

其他更详细的首部信息,可以参考这里

响应包体

服务器返回给客户端的文本信息。
和请求包体的分类一样。

示例

<code>HTTP/1.1 200 OK
Date: Sat, 13 Jul 2019 08:40:52 GMT


Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Content-Encoding: gzip
Connection: close

{"errorCode":-2,"reason":"no changing","result":null}/<code>响应行:返回响应码200 Ok,表示服务端返回数据成功响应头部:Content-Type设置返回的类型为JSON格式响应包体:返回具体JSON数据

HTTPS

HTTP 有以下安全性问题:

使用明文进行通信,内容可能会被窃听;不验证通信方的身份,通信方的身份有可能遭遇伪装;无法证明报文的完整性,报文有可能遭篡改。

HTTPS 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信,也就是说 HTTPS 使用了隧道进行通信。
通过使用 SSL,HTTPS 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)

HTTPS


与HTTP区别

协议原理数据格式传输速度端口HTTP应用层明文传输三次握手,传输三个包80HTTPS传输层SSL加密三次握手基础上增加ssl握手(9个包),


传输12个包443

缺点

因为需要进行加密解密等过程,因此速度会更慢;需要支付证书授权的高额费用。

HTTP框架

Volley

Volley是Google 官方出的一套小而巧的异步请求库,该框架封装的扩展性很强,支持 HttpClient、HttpUrlConnection,甚至支持OKHttp。

OKHttp

OKHttp是Square 公司开源的针对 Java 和 Android 程序,封装的一个高性能 http 请求库,所以它的职责跟 HttpUrlConnection 是一样的,支持 spdy、http 2.0、websocket ,支持同步、异步。
已被谷歌加入到Android的源码中。

Retrofit

Retrofit是Square公司出品的默认基于OKHttp 封装的一套 RESTful 网络请求框架

后续文章会从OKHttp、Retrofit角度来分析Http。

参考

Http这是一份全面& 详细 HTTP协议 学习攻略精读《图解HTTP》HTTP 协议入门