前言
作为一个Android开发,平时学习的侧重点一直在Android这边,久而久之会发现有些其它方面的基础知识欠缺,导致工作中不可避免的尴尬。
- 跟后端沟通一些网络接口相关问题,因为Http基础知识欠缺导致总是不理解他们的意图
- 同事跟你代码合并出现了一些棘手的冲突,或需要回滚版本等问题,开始搜索git命令
- 项目总是时不时的编译或者依赖出问题,又看不懂报错信息,开始可恨自己的Gradle知识的欠缺。
经常遇到的这些问题,开始意识到其它相关领域的基础知识要补一补了。
适合谁看
我希望你经历过实际开发,有一些使用过Http的经验,但是只停留在最基本的使用,对很多问题一知半解,这篇文章会给你一些帮助,让你明白一些网络编程的原理。
定义
HTTP:HyperText Transfer Protocol 超文本传输协议
所谓超文本,就是对文本的扩展,包括二进制文件等
基本工作方式
请求报文
GET /img/bd_logo1.png HTTP/1.1
Host: www.baidu.com
Content-Type: text/plain
Content-Length: 243
......
bodybodybody
-
GET /img/bd_logo1.png HTTP/1.1
是请求行
名称 | 含义 |
---|---|
GET | 请求方式(method) |
/img/bd_logo1.png | 请求路径(path) |
HTTP/1.1 | Http版本 |
- 请求行和body中间的内容,格式为
xxx:xxx
的是Headers,后面会具体介绍 - body可能有也可能没有,例如POST表单提交就会用到body,GET可能用不到
响应报文
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Length: 984
Content-Type: image/x-icon
......
bodybodybody
-
HTTP/1.1 200 OK
是状态行
名称 | 含义 |
---|---|
HTTP/1.1 | HTTP版本 |
200 | 状态码(status code) |
OK | 状态信息(status message) |
- 状态行和body中间是Headers
- body中是返回信息,可能是文本,还可能是二进制文件
Request Method 请求方式
目前HTTP1.1版本一共4种请求方式,常用的有2种GET和POST
GET
为了获取服务器资源,不需要发送body
GET /img/bd_logo1.png HTTP/1.1
Host: www.baidu.com
目的是 获取www.baidu.com/img/bd_logo1.png
这个图片
POST
用于增加或修改服务器资源,携带body
POST /user HTTP/1.1
Host: www.baidu.com
Content-Type: application/x-www-form-urlencoded
name=yuefeng&gender=male
目的是向www.baidu.com/user
发送了一串表单数据name=yuefeng&gender=male
PUT
用于修改资源,携带body
目前一般做法都是通过POST完成,知道即可
DELETE
用于删除资源,不发送body
目前一般做法都是通过POST完成,知道即可
Status Code 状态码(重要)
这块内容一定要记下,属于网络编程的常识问题
Status Code | 含义 |
---|---|
100 | 继续发送,一般用于服务器发送大文件 |
101 | 正在切换协议 |
200 | 成功 |
301 | 永久重定向,目标地址在Header中,key是Location |
302 | 暂时重定向,目标地址在Header中,key是Location |
304 | 内容无变化 |
4xx | 4开头表示客户端错误 |
400 | 客户端请求错误 |
401 | 客户端认证失败 |
403 | 客户端被禁止 |
404 | 内容找不到 |
5xx | 5开头表示服务器内部错误 |
Header
元数据,就是数据的数据;数据的属性;用来描述数据的
- Host (例如:Host: api.yuefeng.com)
只出现于Request中
DNS拿着这个域名,返回一个ip,因为有的公司可能只有一个IP主机,但是却有可能有好几个域名服务
例如IP是1.1.1.1
的主机下存在blog.yuefeng.com
和api.yuefeng.com
两个服务地址
所以host可以准确找到具体的服务 - Content-Length:内容的长度,让服务器知道从开始到哪里结束
- Content-Type:指定body的类型,可能会是以下几种
1.text/html html信息
2.x-www-form-urlencoded:web页面纯文本表单的提交方式,body内容和get的方式一样(name=yuefeng&age=26)
3.multipart/form-data:web页面含有二进制文件时的提交方式
4.application/json:json信息
5.image/jpeg:提交单个图片 - Transfer-Encoding:chunked
分块传输 - Location:重定向的目标URL
- User-Agent:用户代理
- Range/Accept-Range
分段传输,用于断点续传,多线程下载 - Cache-Control:no-cache、no-store、max-age
说一下Cache和Buffer在代码中的区别
cache:这次用过了,一会可能还会再用,降低访问服务器频率
buffer:提前存下来,一会可能用到(例如视频缓冲)
网友评论