1.3 HTTP Header、Body
1. Header 作用:HTTP 消息的元数据
元数据:数据的数据、数据的属性
DNS 查询 Domain Name System 域名系统 域名 -> ip 地址 用域名请求 DNS 服务器获取 ip地址
域名 - 方便人类记忆,但不能用来定位主机
ip 地址 - 定位主机
(1)Host:目标主机地址
给目标主机看,让目标主机定位具体的子主机的,
虚拟主机 一个主机上,其实可能运行了多个服务器,
如一个阿里云主机可能运行了 4 个服务器

如果一个人在浏览器输入:
![]()
阿里云主机根据 Host 将请求发到具体的服务器
所以在地址栏输入的 hencoder.com 其实有两个作用:一个是通过 DNS 查找目标主机 ip 地址,二就是在到达之后让目标主机去定位具体的子主机
这就是 Host 的两个作用
(2)Content-Type/ Content-Length:Body 的 类型 和 长度
为什么要在 Header 里告知长度?
因为 Body 可以传输二进制数据,二进制数据可以表示一切,导致 Body 无法定一个结束符号出来
Content-Type 内容的类型
1. text/html
html 文本

2. application/x-www-form-urlencoded
普通表单 HTML 表单 encoded url 格式
只用在 请求报文 中

对应 retrofit 里的提交方式
用 @FormUrlEncoded 注解,表单里的每个键值对的键用 @Field(或 @FieldMap)来标记。

所以 @FormUrlEncoded 的作用:
让请求在组装 HTTP 报文的时候用普通表单的形式,用和 url 相同的格式来存储纯文本的键值对
当后端实现的接口使用的是普通表单的时候使用此注解
并用 @Field 把字符串配置到 body 里面
3. multipart/form-data
也是表单,但不只传文字,还可以传文件
只用在 请求报文 中

有一个分界 boundary

为什么需要这么长的分界?
因为 multipart 允许二进制文件,用一个简单的 & 不容易分隔,所以分界长这么长
为什么普通表单不用这种方式做?
因为低效,浪费
可是万一 boundary 和 body 重了呢?
如果真重了那这个 HTTP 报文就失败了,就要重发请求了,但概率很小,小到几乎可以忽略,就算重了就再发一次
retrofit 编写方式

multipart 可以传图片,而且使用 multipart 也是目前市面上最多的上传图片的接口类型,另有一些是使用 Base64 + 普通表单来上传,这种纯属于没文化,低效了
还有一种更高效的方式
4. application/json
在 请求报文 和 响应报文 中都会用到
application 代表什么?




application/x-www-form-urlencoded 和 application/json 都是用来提交文本数据的,用哪个?
后端的接口设计的使用哪个就用哪个
两种不同的数据接口格式,不是移动端的设计模式
json 比 url 格式的扩展性更强,因为可以做成多层级

retrofit 写法
还要给 retrofit 加上一个 converter,来让 retrofit 能把各种对象转换成 json 格式的字符串

具体来说 加这么一行

5. image/jpeg / application/zip ...
单文件,一般下载东西服务器用这种格式传文件
上传头像
上面讲到传图片可以用 multipart/form-data 来做,其实上传但用这个 type 更简单更直接

用于 Web api 响应 或 POST / PUT 请求
retrofit 简单用法


(3)Chunked Transfer Encoding
有时传输内容过大,为避免延迟,进行分块传输
但 HTTP 需要在 Header 标明 body 长度,这样客户端才知道什么时候传完了,停止接收,
但分块传输时,发送者可能不知道内容有多长(因为数据可能都还没准备完),
服务器可以使用 Transfer-Encoding: chunked 告知客户端自己要分块传输,当 header 中有这个属性时,可以不用写 Content-Length,

用 0 + 换行 做结尾表示内容结束
(4)Location 重定向目标 URL
301 响应 Header 中

(5)User-Agent 用户代理
是谁真正发起的网络请求、接受的网络响应
是浏览器、手机客户端,
mozilla
可以让服务器端知道请求方是 pc、手机,从而做显示适配,让服务器能针对不同设备特性返回不同内容

(6)Range / Accept-Range 指定 Body 的内容范围
分段加载
用途:
断点续传,分块加载大内容,这样如果加载途中中断,可以从断掉的地方继续加载
多线程下载,如迅雷,使用 多线程下载 + 分段下载 提速,绕过单端口限速
content-type 标明了 Accept-Range 的上限

使用 Range 的时候,响应会标明 Content-Range,指明当前传输的范围、总范围

ps:Cpokie、Authorization
(7)其余

(8)Cache
Buffer 缓冲
上游生产太快,下游消费不动,缓冲起来;
下游还没消费,把生产出来的缓冲起来,以防下游一会不够用了;
Cache 缓存
已经用过的,以防后面还用,缓存起来
HTTP Cache 作用
HTTP 新内容还没刷新到,而手里有用过的 Cache,就可以先拿过来用
相关 Header

浙公网安备 33010602011771号