透视 HTTP 协议
罗剑锋(Chrono)
前奇虎 360 技术专家,Nginx/OpenResty 开源项目贡献者
63943 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
开篇词 (1讲)
透视 HTTP 协议
15
15
1.0x
00:00/00:00
登录|注册

15 | 海纳百川:HTTP的实体数据

Accept-Charset
Content-Language
Accept-Language
br
deflate
gzip
application
audio/video
image
text
内容协商的结果
质量值
内容协商
字符集
语言类型
Content-Encoding
Accept-Encoding
Content-Type
Accept
Encoding type
MIME type
课下作业
小结
动手实验
语言类型使用的头字段
语言类型与编码
数据类型使用的头字段
数据类型与编码
HTTP的实体数据

该思维导图由 AI 生成,仅供参考

你好,我是 Chrono。
今天我要与你分享的话题是“海纳百川:HTTP 的实体数据”。
这一讲是“进阶篇”的第一讲,从今天开始,我会用连续的 8 讲的篇幅来详细解析 HTTP 协议里的各种头字段,包括定义、功能、使用方式、注意事项等等。学完了这些课程,你就可以完全掌握 HTTP 协议。
在前面的“基础篇”里我们了解了 HTTP 报文的结构,知道一个 HTTP 报文是由“header+body”组成的。但那时我们主要研究的是 header,没有涉及到 body。所以,“进阶篇”的第一讲就从 HTTP 的 body 谈起。

数据类型与编码

在 TCP/IP 协议栈里,传输数据基本上都是“header+body”的格式。但 TCP、UDP 因为是传输层的协议,它们不会关心 body 数据是什么,只要把数据发送到对方就算是完成了任务。
而 HTTP 协议则不同,它是应用层的协议,数据到达之后工作只能说是完成了一半,还必须要告诉上层应用这是什么数据才行,否则上层应用就会“不知所措”。
你可以设想一下,假如 HTTP 没有告知数据类型的功能,服务器把“一大坨”数据发给了浏览器,浏览器看到的是一个“黑盒子”,这时候该怎么办呢?
当然,它可以“猜”。因为很多数据都是有固定格式的,所以通过检查数据的前几个字节也许就能知道这是个 GIF 图片、或者是个 MP3 音乐文件,但这种方式无疑十分低效,而且有很大几率会检查不出来文件类型。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

HTTP协议中的实体数据在通信过程中起着至关重要的作用。本文详细介绍了数据类型与编码、头字段的使用、语言类型与编码、内容协商的质量值等关键概念。首先,讲解了MIME type和Encoding type的作用及在HTTP中的应用。其次,阐述了Accept和Content头字段在客户端和服务器进行内容协商中的重要性。接着,介绍了语言类型与字符集的概念,并说明了其在HTTP中的应用。最后,深入讲解了内容协商的质量值,即通过权重来设定优先级。这些内容对于理解HTTP协议中的实体数据至关重要,有助于读者深入了解HTTP协议的细节,以及如何进行内容协商和数据处理。 此外,文章还提供了实验环境和动手操作的指导,让读者能够通过实际操作加深对理论知识的理解。小结部分对数据类型和语言类型进行了概括,并提出了课下作业,引导读者进一步思考和实践。整篇文章以清晰的逻辑结构和丰富的实例,帮助读者全面理解了HTTP协议中的实体数据相关概念。 总之,本文内容丰富、结构清晰,通过理论讲解和实际操作相结合的方式,使读者能够全面了解HTTP协议中的实体数据,为他们在实际应用中做出正确的数据处理和内容协商提供了重要指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《透视 HTTP 协议》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(70)

  • 最新
  • 精选
  • 彧豪
    上周五和服务端做上传图片的时候遇到过这个content-type的问题,上传图片时候我这边需要设置content-type:"image/jpg",然后传完了,我在预览的时候获取图片的地址,此时比如通过a标签的方式打开新标签预览该图片时才能成功预览,不然如果使用上传的js-sdk设置的默认类型:content-type:"octet-stream",那么浏览器就不认识这个图片了,转而会下载这个文件(图片),所以我是不是可以理解为content-type这字段在请求头,和响应头里都能使用?或者上传文件这个业务又不同于一般的请求操作呢?

    作者回复: 是的,看来是我没说清楚,导致有的同学误会了。 content-type是实体字段,所以请求和响应里都可以用,作用是指明body数据的类型。 正文里为了叙述方便,只在服务器的响应报文里出现了content-type,实际上它是个通用字段,如果要发post请求,就需要带上它。

    2019-07-01
    2
    94
  • 走马
    accept 表达的是你想要的 而你发送 post请求时,你发送的数据是给服务器的,这时候就需要像 服务器会用 content-type 标明它给你的数据类型一样,你也需要用 content- 来表明你给别人的数据的一些属性

    作者回复: √

    2019-07-04
    4
    41
  • 亚洲舞王.尼古拉斯赵四
    1.含义是:我这个请求最希望服务器给我返回的编码方式是gzip和deflate,他们俩在我这是最优的地位,我不接受br的编码方式,如果还有其他的编码方式的话对我来说权重0.5。服务器可能的响应头是 HTTP/1.1 200 OK Content-Encoding: gzip 2.请求头可能是 POST /serv/v1/user/auth HTTP/1.1 Content-Type: application/json Accept-Language: zh-CN, zh Accept-Charset: gbk, utf-8 3.MIME类比快递的话就是你要快递的物品(衣服,食物等),Encoding就是快递你这个物品的包装方式,如果是衣服可能就随意一点一个袋子,如果是食物担心腐烂给你放个冰袋进去 不知道回答的对不对,请老师指正

    作者回复: 回答的不错。 第二个问题要修改一下,这也怪我没有说清楚。 content-*字段也可以用在请求报文里,说明请求体的数据类型。在这里不能用accept字段,因为是post,所以要用content-language来指明body的语言类型,在content-type里用charset指明编码类型。 可以参考其他同学的回答。

    2019-07-01
    5
    36
  • 隰有荷
    用post方法请求接口时,在客户端语言的设置上不能使用Accept-Language吗?为什么一定是Contenr-Language呢?是不是Accept-Language只用于get方式时,表明客户端需要的的语言呢?

    作者回复: post和get时都可以使用Accept-Language,表示客户端可以理解的语言,要求服务器按照指示返回数据。 Content-Language表示的是body数据的语言,因为post带有body,所以要用Content-Language来告诉服务器,报文的body是什么。 如果get报文也有body,那么它也可以使用Content-Language。 Accept-Language是请求头字段,只要是发请求就可以带。 Content-Language是实体头字段,只要是有body就可以带。

    2019-10-02
    35
  • 苦行僧
    现在很多小文件 比如图片 都往云存上放了 千万指定正确content-type 一旦指定错 批量修改太麻烦 而且会影响终端的解析

    作者回复: 经验之谈!

    2019-07-02
    2
    28
  • MJ
    老师,每一个并发连接,都需要新建tcp三次握手吗?还是一次tcp握手后,可以并发多个连接?

    作者回复: 每建立一个连接就需要tcp握手,对同一个ip地址+端口,浏览器通常最多建立6个并发连接。

    2019-07-05
    24
  • 1900
    “所以后来就出现了 Unicode 和 UTF-8,把世界上所有的语言都容纳在一种编码方案里,UTF-8 也成为了互联网上的标准字符集。” 这句话最后有点问题吧?Unicode才是字符集,应该是“遵循UTF-8字符编码方式的Unicode字符集也成为了互联网上的标准字符集”,是么?

    作者回复: 嗯,我说的时候不太准确。utf-8只是编码方案,Unicode是字符集。

    2019-07-01
    19
  • BellenHsin
    这篇写的不错

    作者回复: thanks。

    2019-07-01
    2
    12
  • do it
    1、试着解释一下这个请求头“Accept-Encoding: gzip, deflate;q=1.0, *;q=0.5, br;q=0”,再模拟一下服务器的响应头。 :最好使用gzip,deflate压缩格式,我不接受br压缩,如果都没有的话就选择其他格式 2、假设你要使用 POST 方法向服务器提交一些 JSON 格式的数据,里面包含有中文,请求头应该是什么样子的呢? content-type: application/json, charset=gbk content-language:zh-cn, zh 3、试着用快递发货收货比喻一下 MIME、Encoding 等概念。 物品的种类(水果、衣服)就是MIME,包装方式就是Encoding

    作者回复: 回答的很好,继续努力。

    2020-05-20
    9
  • 做web开发有两个问题,估计许多人都遇到过,一个是乱码问题,这个是字符集设置不一致导致的具体哪里设置的不一致通常需要观察所有需要数据转换的地方,一般是客户端和服务器端不一致了。另外,就是文件上传,这个格式一定要设置对,否则就会感到莫名其妙。 我想请教老师两个问题: 1:看到说浏览器最多会有六个连接并发执行,为什么是六个,不会是因为六六大顺吧? 2:文件上传的速度和文件的大小密切相关,文件上传的大小限制都是有哪些限制或控制?之前,这是老早了,发现有些框架默认只能是2g

    作者回复: 1.这个是rfc的规定,其实以前还要小。 2.http协议对大小没有限制,这些应该都是网站服务器做的限制,比如Nginx就可以设置client body的大小。

    2020-03-29
    5
收起评论
显示
设置
留言
70
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部