http的body

数据类型和编码

HTTP协议为什么要关心 body

  1. TCP/IP 协议栈,传输数据基本格式:header+body。
  2. TCP、UDP是传输层协议,不关心body数据是什么,只要把数据发送给对方就算完成了任务。
  3. HTTP 协议是应用层协议,数据到达只能说工作完成了一半,还需要告诉上层应用,这是什么数据,否则上层应用不知所措。

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型

  1. MIME 用在电子邮件中,可以让电子邮件发送ASCII 码以外的任意数据,给数据定义了一个标准规范。
  2. MIME 把数据分为8大类,每个大类下再细分多个子类,形式为“type/subtype”的字符串,纳入到了HTTP头字段里。
  3. HTTP 使用了其中一部分,用来标记 body 的数据类型,即 MIME type。

HTTP 常用数据类型 MIME type

  1. text

    • 文本格式的可读数据
    • text/html 表示超文本文档;text/plain 纯文本;text/css 样式表
  2. image
    • 图像文件
    • image/gif;image/jpge; image/png
  3. audio/video
    • 音频和视频数据
    • audio/mpeg;video/mp4
  4. application
    • 数据格式不固定,可能是文本也可能是二进制,必须由上层应用程序来解释。
    • application/json;application/javascript;application/pdf
    • application/octetstream 不透明的二进制数据

HTTP 常用的编码格式 Encoding type

  1. HTTP 在传输时为了节约带宽,有时还会压缩数据,为了不要让浏览器继续猜,还需要一个Encoding type,告诉数据用什么编码格式,这样对方才能正确解压缩,还原出原始数据。
  2. 常用的Encoding type
    1. gzip:GNU zip 压缩格式,最流行
    2. deflate:zlib 压缩格式,也流行
    3. br:一种专门为HTTP优化的新压缩算法

数据类型使用的头字段

有了MIME type和Encoding type,无论是浏览器还是服务器都可以很轻松识别出body的类型,这样就能正确处理数据了。

为了客户端和浏览器的“内容协商”,HTTP协议定义了两个 Accept 请求头字段和两个 Content 实体头字段。

客户端用Accept 头告诉服务器希望接收到什么样的数据;服务器用 Content头告诉客户端实际发送了什么样的数据。

举例:

Request Headers:
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br Response Hraders:
Content-Length: 718
Content-Type: text/plain; charset=UTF-8

语言类型和编码

  1. 为了解决body 的语言“国际化”的问题,引入【语言类型和字符集】的概念。
  2. 语言类型:type-subtyoe,如英语,汉语,日语等
    • en 任意英语
    • en-US 美式英语
    • en-GB 英式英语
    • zh-CN 汉语
  3. 字符集:charset,如 ASCII,GBK,UTF-8 等
  4. 语言类型使用的头字段
Accept-Language: zh-CN,zh;q=0.9
Content-Language:zh-CN
  1. 字符集在HTTP中使用的头字段是 Accept-Charset ,但是响应头却没有对应的Content-Charset,而是在 Content-Type 字段的数据类型后面用 charset=xxx 表示。

内容协商的质量值

  1. HTTP协议里用 Accept、Accept-Encoding、Accept-Language 等请求头字段进行内容协商的时候,还可以用一种特殊的“q”参数表示权重来设定优先级。
  2. “q”的含义,“quality factor”。
  3. 权重的取值:
    • 最大 1;最小 0.01;默认值为1,0表示拒绝
    • 表示:; q=0.01
  4. 举例:Accept:text/html,application/xml;q=0.9,/;q=0.8
    • 它表示浏览器最希望使用的是 HTML文件,权重是1
    • 其次是 xml 文件,权重是 0.9
    • 最后是任意数据类型,权重是 0.8
    • 服务器收到请求头后,就会计算权重,再根据自己的实际情况优先输入 HTML 或 XML。

内容协商的结果

  1. 内容协商的过程是不透明的,每个web服务器使用的算法都不一样
  2. 有时服务器会在响应头多加一个 Vary 字段,记录服务器在内容协商时参考的请求字段,给出一些信息。
    • 举例:Vary:Accept-Encoding,User-Agent,Accept
    • 表示:服务器依据上面三个字段,然后决定了发回的响应报文。

12 HTTP的实体数据的更多相关文章

  1. 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

    第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...

  2. Dynamic CRM 2013学习笔记(三十一)自定义用excel批量导入实体数据

    有一个实体的子表数据量太大,于是客户想用execel来导入实体数据.首先想到的是用系统自带的Import Data,客户嫌太麻烦,比如lookup字段要做map等. 下面是具体的实现步骤: 一.定义e ...

  3. 9.12 翻译系列:数据注解特性之ConcurrencyCheck【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/concurrencycheck-dataannotations-attribute-i ...

  4. VS2017 之 MYSQL实体数据模

    Photon Server 和 Unity3D 数据交互: Photon Server 服务端编程 Unity3D 客户端编程 VS2017 之 MYSQL实体数据模 一.新建数据库连接后,点击下一步 ...

  5. asp.net三层架构 及其中使用泛型获取实体数据介绍

    asp.net中使用泛型获取实体数据可以发挥更高的效率,代码简洁方便,本例采用三层架构.首先在model层中定义StuInfo实体,然后在 DAL层的SQLHelper数据操作类中定义list< ...

  6. 使用ADO.NET 实体数据模型连接MySql

    原文:使用ADO.NET 实体数据模型连接MySql 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a123_z/article/details/8 ...

  7. HTTP的实体数据

      数据类型表示实体数据的内容是什么,使用的是MIME    type,相关的头字段是Accept和Content-Type:  text:即文本格式的可读数据,我们最熟悉的应该就是text/html ...

  8. 《Entity Framework 6 Recipes》中文翻译系列 (10) -----第二章 实体数据建模基础之两实体间Is-a和Has-a关系建模、嵌入值映射

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 2-11 两实体间Is-a和Has-a关系建模 问题 你有两张有Is-a和Has-a ...

  9. Enterprise Solution 生成实体数据访问接口与实现类型 Code Smith 6.5 模板文件下载

    数据库表定义为SalesOrder,用LLBL Gen Pro生成的实体定义是SalesOrderEntity,再用Code Smith生成的数据读写接口是ISalesOrderManager,最后是 ...

  10. 《Entity Framework 6 Recipes》翻译系列 (4) -----第二章 实体数据建模基础之从已存在的数据库创建模型

    不知道对EF感兴趣的并不多,还是我翻译有问题(如果是,恳请你指正),通过前几篇的反馈,阅读这个系列的人不多.不要这事到最后成了吃不讨好的事就麻烦了,废话就到这里,直奔主题. 2-2 从已存在的数据库创 ...

随机推荐

  1. 【pandas小技巧】--花哨的DataFrame

    最近github上发现了一个库(plottable),可以用简单的方式就设置出花哨的 DataFrame 样式. github上的地址:https://github.com/znstrider/plo ...

  2. CentOS 内网YUM源配置使用

    YUM介绍 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的开发者 ...

  3. Vue【原创】基于【日历组件Calendar】的【节假日管理】功能整合

    基于日历组件(lilo-calendar)的节假日管理功能整合. 效果图: 完整代码: 1 <template> 2 <div class="root-calendar&q ...

  4. 搭建企业知识库:基于 Wiki.js 的实践指南

    一.简介 在当今知识经济时代,企业知识库的建设变得越来越重要.它不仅有助于企业知识的沉淀和共享,还能提升员工的工作效率,促进企业的创新发展.企业知识库是企业中形成结构化文档,共享知识的集群,可以促进企 ...

  5. 关闭Google"阻止了登录尝试"方法, 其他设备也能登录Gmail等谷歌服务

    首先登录谷歌账户,  访问 https://www.google.com/settings/security/lesssecureapps 把"不够安全的应用的访问权限" 启用打勾 ...

  6. BZ全景可视化编辑器 (KRPano可视化编辑器, 无需编写任何代码制作全景漫游)

    软件简介 BZ全景编辑器是一款KRPano全景可视化编辑工具,下载安装即可使用,无需拥有任何KRPano代码基础,便可以制作生成精美的全景漫游作品. 官方网站: 点击进入官方网站 最新版软件下载地址: ...

  7. 分库表数据倾斜的处理让我联想到了AKF模型

    1 背景 最近在做需求的时候需要在一张表中增加一个字段. 这张表情况如下: 1.拆分了多个库多张表 2.库表拆分按表中商户编码字段hash之后取模进行拆分 由于库表拆分按照商户编码,有些大商家的单子数 ...

  8. Solution Set -「ABC 205」

    应该是最近最水的 ABC 了吧. 「ABC 205A」kcal Link. 略 #include <bits/stdc++.h> using ll = long long; #define ...

  9. linux常见命令(五)

    用于文本内容处理的相关命令 sort uniq cut comm diff sort:对文件中数据进行排序,并将结果显示在标准输出上 命令语法:sort [选项] [文件] 选项 选项含义 -m 如果 ...

  10. Ubuntu 14.04解决登录界面无限循环的方法

    在Ubuntu下配置Android的环境时,想像在Windows中那样在终端中直接启动adb,以为Linux和Windows一样,将adb的路径添加到环境变量中,于是将adb的路径也export到/e ...