HTTP是什么
直接翻译过来http是超文本传输协议。就是浏览器上面输入的地址,打开的网页,或者android中发送的接口返回的数据。超文本就是html,传输超文本的协议就是HTTP啦
HTTP的工作方式
基本就是客户端输入地址,请求服务器,响应返回超文本协议,然后通过客户端来渲染,展示这些数据。
URL转换成HTTP报文
请求报文
http://www.baidu.com/xxxx http是协议,www.baidu.com是host服务器地址,xxxx是路径PATH 通过GET请求发送形式如下
GET /xxxx HTTP/1.1 这个是请求行,包含请求方法 请求的路径 和HTTP的版本
请求行下面是HEADER
这行下面会有HOTS:www.baidu.com content-type content-length 啊等等,包含验证信息啥的
Header下面是请求体内容BODY get请求一般没有body
所以基本上请求的协议内容大概是下面的格式
请求行
请求HEADER
请求BODY
响应报文
响应报文是服务器返回给我们的,其实跟请求行的大体格式差不多
状态行 HTTP/1.1 200 OK HTTP版本 响应码 对应请求行
响应的HEADRE 包含一些基本的头或者压缩格式等等
响应BODY这个一般是我们最常用的,返回的JSON数据就在BODY里面
响应行
响应头
响应BODY
请求方法
我们最常用的是post和get post提交数据代body get不带
其实按照HTTP的请求规范其实我们最长用的增删改查应该用不同的方法来表示
get post delete put 方法对应最基本的数据操作 查 增 删 改
查 和 删是幂等的操作,操作一次下一次就是一样的了。还有比较常用的方法是head方法
head跟get是很像的,差别是head不会返回请求的body,在下载的使用用这个比较多,先head请求服务器,返回下载的信息,本地做准备后在get请求下载
响应码
1xx
2xx
3xx
4xx
5xx
这些状态码能全部说出来具体谁什么意思的人估计很少,这个其实也是最基础的东西,我们常见的是200 和404,一个对应成功,一个是客户端错误,常见的浏览器404
我们具体说下这些码的意思
1xx 临时性消息 101/100是最常见的 一般是问支持不支持http2,支持将会返回101表示支持,客户端切换,不支持会一般返回200成功。上传大文件的时候要分成好几块传输,这时候加个header,要求服务器收到消息后返回一个确认,这个header是跟服务器说我还没发完后面还有,服务器收到这个header会返回100表示知道了,后面的你继续发,等发完后客户端就不会再发这个header了,那么服务器最好会返回一个200的标志位
2xx 这个很常见,成功的标志位
3xx 见得一般多的是301/302/304 301/302表示重定向到新的连接,304一般表示的是跟上一次请求没有什么改变
4XX 客户端错误
5XX 服务器端错误
Header
发送的是HTTP的元数据。
header中的第一行是HOST。我们在浏览器中输入网址回车的时候,第一步是根据域名通过DNS找到对应的主机IP,然后通过IP与主机进行通信,那么这里为什么header中要加上HOST呢,我们都拿到了主机地址了,要这个应该没什么用了啊?其实不然,一个IP是可以配多个域名的,可以叫a.com 也可以加一个b.com,如果要请求的是a.com下的内容只有IP的话服务器就懵逼了,不知道该具体从a.com找还是从b.com找了。所以必须加上host
常用的header
content-length 内容的长度告诉服务器应该读多长的数据
content-type 返回的数据类型。
text/html 文本的格式
application/x-www-form-urlencofed 普通的表单 eccoder URL格式,这个比较重要 在用Retrofit等网络架构的时候提交POST请求用这个注解。然后读@field注解的参数 这个就是 formUrlEncoder android就是模仿网页的表单提交的。POST表单都是把参数拼接起来放在body中传过去的,理解了这个retrofit中用POST就很好理解了。
multipart/form-data 多部分形式,一般包含二进制文件内容。普通表单一般是传输文本的。传文件用这个。这两个都是传统网页上过渡过来的。retrofit 用这个注解multipart 然后用 @part 传输requestBody
application/json:json 返回json数据
image/jpeg 传输图片,直接传图片流 这个很方便,但是后端一般还是通过表单来传输。图片流用base64编码然后通过post传输正常的表单文本
content-type非常之重要上面提到的一般常用的type一定要会
Transfer-Encoding;chunked
服务器返回的数据比较大不能一下全返回,为了响应速度,先返回一部分通过这个来进行分块的传输。分块传输不知道具体的文件有多长。content-length不能使用。格式如下:
Body:
<length1>
<data1>
<length2>
<data2>
0
(最后传输0表示内容结束)
Location 重定向的URL目标 301/302用
User-Agent 用户代理可以定制客户端的来源
Range/Accept-Ranget 支持分断流时候用可以请求一部分的内容 比如请求图片的一半返回 Accept-ranger表示服务器支持分断,客户端的header 加Ranger可以指定从哪返回数据,一半用于断点续传
Cookie 做埋点功能
AUTHORIZATION 授权信息,服务器根据这个判断权限
Cache 缓存
Buffer 缓冲
Cache-Control:no-cache 可以缓存 no-store不可以缓存 max-age过期时间 private/public 中间节点是否帮助缓存(路由器网关)
基本了解了上面这些内容,在android中对网络请求这块就能胜任了
结语:感谢hencoder 感谢扔物线凯哥