Android网络编程-HTTP/HTTPS

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,在TCP/IP体系中属于最高层(应用层)是用于从万维网服务器传输超文本到本地浏览器的传送协议。
HTTP协议工做于客户端-服务端架构为上。浏览器做为HTTP客户端经过URL向HTTP服务端即WEB服务器发送全部请求。Web服务器根据接收到的请求后,向客户端发送响应信息。 这是最基本的HTTP工做原理,如图所示: html

C/S架构

HTTP报文

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

请求报文

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

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

请求行

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

请求方法

方法 做用 说明
GET 获取资源 用来请求访问已被URI标识的
POST 传输实体主体 POST主要用来传输数据,而GET主要用来获取资源
HEAD 获取报文首部 和GET方法相似,可是不返回报文实体主体部分
PUT 上传文件 用来传输文件,因为自身不带验证机制,任何人均可以上传文件
DELETE 删除文件 与PUT功能相反,而且一样不带验证机制
OPTIONS 查询支持的方法 用来查询针对请求URI请求的资源支持的方法
TRACE 追踪路径 服务器会将通讯路径返回给客户端
CONNECT 要求用隧道协议链接代理 使用 SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通讯内容加密后经网络隧道传输

请求URL

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

协议版本

  • HTTP/1.0:HTTP协议的第二个版本,第一个在通信中指定版本号的HTTP协议版本,至今仍被普遍采用
  • HTTP/1.1:HTTP协议的第三个版本是HTTP 1.1,是目前使用最普遍的协议版本
  • HTTP/2.0:HTTP 2.0是下一代HTTP协议,目前应用还很是少

请求头部

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

字段 说明
Accept 用户代理可处理的媒体类型
Accept-Encoding 优先的内容编码
Accept-Encoding: gzip, deflate, br
Authorization Web 认证信息
Cache-Control 控制缓存的行为
Connection 控制再也不转发给代理的首部字段、管理持久链接
Content-Encoding 实体主体适用的编码方式
Content-Type 实体主体的媒体类型
Content-Length 实体主体的大小
Host 请求资源所在服务器
If-Modified-Since 服务器上次返回的Last-Modified日期,若是在这个日期以后,
请求的资源都没有更新过,则返回304 Not Modified响应
If-None-Match 比较实体标记,值为上一次返回的ETag,
通常会和If-Modified-Since一块儿返回
Referer 对请求中URI的原始获取方
User-Agent HTTP 客户端程序的信息
Cookie 保存状态信息
Transfer-Encoding 指定报文主体的传输编码方式

请求包体

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

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

示例

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

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
复制代码
  • 请求行:显示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 令客户端重定向至指定 URI
Server HTTP 服务器的安装信息
Last-Modified 资源的最后修改日期时间
Set-Cookie 设置Cookie,客户端获得响应报文后把 Cookie 内容保存到浏览器中

其余更详细的首部信息,能够参考这里

响应包体

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

示例

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}
复制代码
  • 响应行:返回响应码200 Ok,表示服务端返回数据成功
  • 响应头部:Content-Type设置返回的类型为JSON格式
  • 响应包体:返回具体JSON数据

HTTPS

HTTP 有如下安全性问题:

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

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

HTTPS

与HTTP区别

协议 原理 数据格式 传输速度 端口
HTTP 应用层 明文传输 三次握手,传输三个包 80
HTTPS 传输层 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。

参考

相关文章
相关标签/搜索