HTTP Content-Type Accept-Charset Accept-Encoding

版权声明:有些文章写的很随意,那是仅作为个人记录的文章,建议直接关掉,多看一秒亏一秒 https://blog.csdn.net/qq_36523667/article/details/82875230

最近在阅读Okhttp源码的时候,遇到了Content-Type:application/x-www-form-urlencoded

其实还有一种常见的编码格式是application/json

因为自己有一些理解,而且比较懒,所以我不百度了

Content-Type里的东西就是告诉双方,数据的格式是怎样的

数据放在哪呢?可以是在url中,可以是在body里。

application/x-www-form-urlencoded就是表单格式,

application/json就是json格式,

本质上都是键值对,只不过大家的套路不同而已

表单是啥

以前被整的对表单有点害怕,哇,好牛逼,我不懂欸。。。其实就是一种和json一样的用于存放键值对的数据格式。

声明了Content-Type,就代表告诉了对方,这是怎样的键值对数据格式。对方就按照这种方式去解析了。当然你也可以不声明,对方可以一种种方式去判断,判断到底是啥,这性能损失有点太大了

Accept-Chaset、Accept-Encoding

得先理解整个HTTP协议。

HTTP协议底层到底长啥样子?其实就是流,编码格式是utf-8。你把他转回来,又是一种特殊的数据格式,也是一种类似键值对的东西,这就是HTTP特有的数据格式。

然后的东西是我猜测的,body里的东西仍会进行一次编码,由accept-charset控制;也就是说你拿到body后要先解码,目前它是流的形式(解码注意了,你用什么字符集转字符流的,那么就只能用这种字符集转回来。然后再进行字符流和字节流的转化)。解码后就得到了比如表单数据格式、json数据格式的数据。

Accept-Encoding则又是在此基础上的压缩,常见的有gzip。上面不是已经把应用层的数据,转化成了键值对格式,然后又转化成字节流了吗。现在就是一堆010101的东西了。Accept-Encoding是对字节流的压缩,采用比如哈夫曼压缩算法,把比如本来100M的字节流转化成30M。

所以综合HTTP的解析,步骤如下:

1.HTTP协议是字节流,按utf-8解析得到真实文本

2.按照HTTP的键值对规范去解析出HTTP的一切到应用层中

3.拿到body

4.解压缩,超短的字节流变成原来的超长的字节流

5.解码,字节流按对的编码格式去解码,转成真实文本数据

6.对文本数据按某键值对格式进行解析,得到应用层里的键值对

上述是我结合平时看的一些网络框架的源码分析出来的,还有待验证,不过应该八九不离十。

猜你喜欢

转载自blog.csdn.net/qq_36523667/article/details/82875230