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

 

posted on 2024-06-15 14:52  __Roxas  阅读(10)  评论(0)    收藏  举报