HTTP,概念及报文格式
HTTP
HTTP是什么
超文本传输协议,HyoprText Transfer Protocol 一种通信协议,用于网络通信
协议:只有智能足够高,沟通才不需要协议
超文本:HTML,最初诞生就是为了传输html,超指的是可扩展
HTTP工作方式
浏览器就是对html进行渲染变为可视化网页
URL如何转为HTTP报文
全称Uniform Resoure Locator 统一资源定位符,网络资源所在地址,也就是我们常说的网址。
http:/ /www.baidu.com/ user?gender=male
上面的地址对应了:协议类型 服务器地址 路径
Header
GET请求与应答报文示例
---- 请求行 ----
GET /path HTTP/1.1 # GET请求方式 请求资源路径 HTTP协议版本
---- 请求头 -----
Host: www.baidu.com # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Upgrade-Insecure-Requests: 1 # 让浏览器升级不安全请求,使用https请求
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 # 用户代理,也就是客户端的名称
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 # 可接受的数据类型
Accept-Encoding: gzip, deflate # 可接受的压缩格式
Accept-Language: zh-CN,zh;q=0.9 #可接受的语言
Cookie: pgv_pvi=1246921728; # 登录用户的身份标识
--- 空行 ---
--- 响应行/状态行 ---
HTTP/1.1 200 OK # HTTP协议版本 状态码 状态描述
--- 响应头 ---
Server: Tengine # 服务器名称
Content-Type: text/html; charset=UTF-8 # 内容类型
Transfer-Encoding: chunked # 发送给客户端内容不确定内容长度,发送结束的标记是0\r\n, Content-Length表示服务端确定发送给客户端的内容大小,但是二者只能用其一。
Connection: keep-alive # 和客户端保持长连接
Date: Fri, 23 Nov 2018 02:01:05 GMT # 服务端的响应时间
--- 空行 ---
--- 响应体 ---
<!DOCTYPE html><html lang=“en”> …</html> # 响应给客户端的数据
请求方式
GET 获取资源
POST 可以增加和修改资源 非幂等
在编程开发中,对于幂等的定义为:无论对某一个资源操作了多少次,其影响都应是相同的。 换句话说就是:在接口重复调用的情况下,对系统产生的影响是一样的,但是返回值允许不同,如查询。
PUT 修改
DELETE 删除
HEAD 获取资源查看head,没有Body
状态码
- 1XX 临时性消息 101切换协议 100多个请求合并
- 2XX 成功
- 3XX 重定向,一般是资源迁移
- 4XX 客户端错误 资源不存在,无权限等
- 5XX 服务器异常
HOST
并不是用来定位目标主机,定位主机是通过域名然后DNS查询ip地址
是服务器用来确定子主机,所以域名有两个作用:查询主机地址,然后定位子主机
Content-Length
内容长度(字节),因为数据可能是二进制的,无法用某个字符来标志报文的结尾,所以直接告诉数据长度,来确认何时接受完毕
Content-Type
Text/html:html文本,用于浏览器 页面响应
Application/x-www-form-urlencoded 普通表单(纯文字表单),用encoded url方式
键=值&键=值
,retrofit的@FormUrlEncoded
注解就是这个Multipart/form-data:多部分形式,一般用于传输包含二进制内容的多项内容,如文件.文字的混合传输,不同数据中间有长字符串分割(自动),retrofit的
@Multipart
application/json:json形式
image/jpeg/application/zip …:单文件
Chunked Transfer Encoding
分块传输
服务端数据量太大或无法一次获取全部内容,导致所需数据无法一次准备完毕,需要等待很久可以使用,此时head中type标记为Transfer-Encoding:chunked
此时是没有content-length的,因为无法确定切割长度
此时的body格式
<lenght1> <data1> <length2> <data2> 0
0为传输结束标志
Loacation
重定向的目标url
User-Agent
用户代理
可以获取发送请求浏览器类型,从而区分是手机访问还是电脑访问
Range/Accept-Range
指定body的内容范围
可以查看是否支持多段下载,用于断点续传,多线程下载等
相关header字段:range,content-range
Cookie/Set-Cookie
发送Cookie/设置Cookie
Authorization
授权信息
Cache
对比失效时间(Last-Modified),对比指纹(Etag)等来确定是否使用缓存内容
REST
一套更规范的http使用范式