现代互联网下,每天都会有数以亿计的各种媒体对象经由HTTP传输,如图像,文本,影视以及软件程序等。这些数据都包含在HTTP报文的实体内容中,如果把HTTP报文想像成一份快递,HTTP实体就是快递实际的货物,而首部字段只是贴在快递上用来描述货物的信息。HTTP必须确保它的报文实体被正确识别,提取以及适当处理。为了实现报文实体能被正确的识别,HTTP提供了Content-Type实体首部字段来描述报文实体的媒体格式。

一:MIME.(媒体类型)

  因特网上有数千种不同的数据类型,HTTP仔细地给每种要通过Web传输的对象都打上了名为MIME类型的数据格式标签。最初设计MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩展)是为了解决在不同的电子邮件系统之间搬移报文时存在的问题。MIME在电子邮件系统中工作的非常好,因此HTTP也采用了它,用来描述并标记多媒体内容。

  Web服务器会为所有的HTTP对象数据附加一个MIME类型。当Web浏览器从服务器中取回一个数据对象时,会去查看相关的MIME类型,看看自己能否知道应该如何处理这个对象。大多数浏览器都可以处理数百种常见的媒体数据类型,如显示图片,解析HTML等。首部字段Content-Type正式说明了体的MIME类型的实体首部字段。

  MIME类型由一个主媒体类型(比如:text,image,audio等)后面跟一条斜线以及一个子类型组成,子类型用于进一步描述媒体类型。

 常见的媒体格式如下:

text/html: HTML文本格式
text/plain:纯文本格式
text/xml:XML格式 image/gif: gif类型的图片格式
image/jpeg: jpg类型的图片格式
image/png: png类型的图片格式 application/xml: XML数据格式
application/json: JSON数据格式
application/x-www-form/urlencoded:对表单数据进行默认编码为key/value的数据格式. multipart/form-data:多部分数据格式,在上传数据时使用.

二:POST提交表单数据编码格式.

  当我们用POST请求进行表单提交时,会将表单数据进行encoded(编码)后放入请求实体中。HTML的form表单的enctype属性用来指定请求的content-type属性值和对表单数据编码的方式。

 form 表单提供了三种编码格式:

   1.application/x-www-form-urlencoded (默认)

   2.multipart/form-data

   3.text/plain 不可靠的方式,实际中不会使用。

 下面是一个包含file上传的表单。

<form action="/FileUploadServlet"  method="POST">
<input type="text" name="username"/>
<input type="password" name="password"/>
<input type="file" name="fileName"/>
<input type="submit" value="Send"/>
</form>

现在,假设我们在表单中依次输入: CYanLong 123456 并且添加了一张名为cover.jpg的图片。

1.application/x-www-form-urlencoded(默认)

 当我们没有对其指定enctype值或者显示指定enctype="application/x-www-form-urlencoded"值时,Request报文的Content-Type字段值和请求实体如下:

#Content-Type首部字段.
Content-Type:application/x-www-form-urlencoded #请求实体内容.
username=CYanLong&password=123456&fileName=cover.jpg

 在这里,我们可以看出application/x-www-form-urlencoded对表单数据进行的编码方式:

按照input节点的顺序对每个input的name/value之间加入'=',
并用&连接并区分每一组name/value. 的确,正如它名字中的urlencoded,这种编码方式跟URL后面的查询参数编码类似. 注意,这里只是将文件名作为input的value值。对于图片的二进制数据,并没有传输.

2.多部分媒体类型和文件上传.(multipart/form-data)

  从上面我们可以看出,默认 ( application/x-www-form-urlencoded ) 的编码方式只会将文件名作为 file 类型的 input 的value编码到请求实体。这种编码方式对于二进制等非字符数据无法有效的传输。

  所以,当上传文件时,我们需要重新指定 enctype 的值。

  MIME中的multipart(多部分)表示一个报文主体由多种不同类型数据组成,例如上面的表单提交,text和passwod等文本字段值和file类型的二进制文件数据需要在同一个请求实体中发送。

  当我们指定enctype="multipart/form-data",同样在表单中输入 CYanLong、 123456、 和名为cover.jpg的图片时,得到的Content-Type请求字段和请求实体如下:

#请求首部字段Content-Type的值.
Content-Type:multipart/form-data;boundary=WebKitFormBoundary2PqYvKIeYWTL50nY #请求实体内容.
--WebKitFormBoundary2PqYvKIeYWTL50nY
Content-Disposition:form-data;name="username" CYanLong
--WebKitFormBoundary2PqYvKIeYWTL50nY
Content-Disposition:form-data;name="passowrd" 123456
--WebKitFormBoundary2PqYvKIeYWTL50nY
Content-Disposition:form-data;name="files";filename="cover.jpg"
Content-Type:image/jpeg --WebKitFormBoundary2PqYvKIeYWTL50nY--

 由此,我们可以得到:

1.Content-Type 设置了实体内容为multipart/data类型,并且表单字段数据被boundary字符串分割。

2.每个被分割开的表单字段都得到了Content-Disposition:form-data;name=<表单名>;fileName=<文件名>(如果是文件部分)

三.JSON数据格式的媒体类型。(application/json)

  提到JSON数据格式,就要简单聊一聊Ajax技术,它是一项利用JavaScript和DOM来进行局部页面替换的异步通信手段。我们来看看Ajax的全称:Asynchronous JavaScript and XML(异步 JavaScript 和 XML技术),是的,在没有JSON之前,利用Ajax技术得到的服务器数据都是XML格式的。然而,JSON以它灵活,轻巧,易解析等优点已取代了XML成为了独立于语言的,非常流行的数据交互格式。

  这里主要是介绍JSON数据作为请求实体时的Content-Type值: application/json

  1.首先,我们来看看,当服务器端要返回JSON数据时该对Response做些什么? (以Java语言为例.)

	response.setHeader("Content-Type","application/json");
response.getWriter.write("{\"name\":\"ChenYanLong\",\"age\":\"20\"}"); //注:反斜杠为转义 " .

  上面两行Servlet代码很好理解,首先设置response报文中Content-Type首部字段的值为:application/json.然后输出Json格式的数据即可.

  同理,当客户端需要发送JSON格式的数据给服务器端时,只需要通过Ajax中XMLHttpRequest的setRequestHeader方法设置Content-Type值即可.

xhr.setRequestHeader("Content-Type","application/json");

总结:

  本篇文章主要介绍了一个非常重要且常用的实体首部字段:Content-Type。大致上,Content-Type就是用来说明对应的HTTP报文请求实体的媒体内容。

Content-Type实体首部字段的更多相关文章

  1. http协议(十)实体首部字段

    1.定义 包含在请求和响应中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息 2.Allow 通知客户端能够支持的Request-URI指定资源的所有http方法 如果服务器接收到不支 ...

  2. http协议基础(十)实体首部字段

    1.定义 包含在请求和响应中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息 2.Allow 通知客户端能够支持的Request-URI指定资源的所有http方法:如果服务器接收到不支 ...

  3. HTTP协议图--HTTP 报文首部之首部字段(重点分析)

    1.首部字段概述 先来回顾一下首部字段在报文的位置,HTTP 报文包含报文首部和报文主体,报文首部包含请求行(或状态行)和首部字段. 在报文众多的字段当中,HTTP 首部字段包含的信息最为丰富.首部字 ...

  4. HTTP报文(首部字段)

    HTTP报文 请求报文/响应报文 结构: 报文首部 + (可选)报文主体(两者通过空行CR + LF来划分) 使用首部字段是为了给浏览器和服务器提供报文主体大小.所使用的语言.认证信息等内容 HTTP ...

  5. HTTP首部字段详解

    HTTP首部字段详解 在HTTP/1.1规范中定义了47种首部字段,总共分为四大类: 通用首部字段 -- 请求报文和响应报文两方都会使用的首部 请求首部字段 -- 从客户端向服务器端发送请求报文时使用 ...

  6. HTTP 首部字段详细介绍

    本文是HTTP解析系列第二篇,如果对http协议不是很了解,可以选去看第一篇:带新手走进神秘的HTTP协议,本文主要是对Http的首部字段进行详细解析. HTTP 协议的请求和响应报文中必定包含 HT ...

  7. HTTP 协议常见首部字段

    首部字段 1.HTTP协议的请求和响应报文中必定包含HTTP首部.首部内容为客户端和服务器处理请求和响应提供了所必须的信息. 2.HTTP首部字段是由首部字段名和字段值构成,中间用冒号“:”隔开.字段 ...

  8. HTTP首部字段完全解析

    http协议是前端开发人员最常接触到的网络协议.在开发过程中,尤其是调试过程中避免不了需要去分析http请求的详细信息.在这其中头部字段提供的信息最多,比如通过响应状态码我们可以直观的看到响应的大致状 ...

  9. HTTP全部报文首部字段

    总结了一下HTTP各种报文首部字段. HTTP报文类型与结构 HTTP报文结构 报文首部 空行(CR+LF) 报文主体 HTTP报文类型 http有两种类型报文,请求报文和响应报文两种报文的首部结构如 ...

随机推荐

  1. JuliaSet&MandelBulb @ Maya&KK —— 4亿粒子的测试

    分形是数学里最美的一个话题之一,美在 无限的细节 在尺寸上的自相似 这两个特征造成的牛逼效果就是随便选择分形上的一个小坑或者小山包拉进后又是一个广阔的世界,而把这个世界中的一个小坑或者小山包拉进又™是 ...

  2. Maven学习总结(1-10)

    Maven学习总结(1-10) 本文转自 孤傲苍狼 博客,讲解精炼易懂,适合入门,链接及截图如下 http://www.cnblogs.com/xdp-gacl/tag/Maven%E5%AD%A6% ...

  3. VirtualBox的usb支持

    解决usb支持: 0. 下载Oracle_VM_VirtualBox_Extension_Pack-4.0.4-70112.vbox-extpack后双击即可采用VB安装,若还是用ark打开可人为设置 ...

  4. DES加密后get获取url参数无法解密问题

    参考:http://www.cnblogs.com/lori/archive/2011/09/08/2170979.html 问题,就是URL编码问题,如果不对URL进行编码直接加码,那么在解码时,如 ...

  5. 多次读取请求request里数据

    如果请求是GET方法,可以直接通过getParameter(String param)方法读取指定参数,可读取多次: 而POST方法的参数是存储在输入流中,只能读一次,不能多次读取. 有时需要在fil ...

  6. 移动开发框架,第【二】弹:Hammer.js 移动设备触摸手势js库

    hammer.js是一个多点触摸手势库,能够为网页加入Tap.Double Tap.Swipe.Hold.Pinch.Drag等多点触摸事件,免去自己监听底层touchstart.touchmove. ...

  7. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(37)-文章发布系统④-百万级数据和千万级数据简单测试

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(37)-文章发布系统④-百万级数据和千万级数据简单测试 系列目录 我想测试EF在一百万条数据下的显示时间! ...

  8. linux内核学习-建议路线

    三大经典书: LDD: Linux Device Driver 容易上手 LKD: Linux Kernel Development 通俗易懂 UDK: Understand Linux Kernel ...

  9. libpcap使用

    libpcap是一个网络数据包捕获函数库,功能非常强大,Linux下著名的tcpdump就是以它为基础的.今天我们利用它来完成一个我们自己的网络嗅探器(sniffer) 首先先介绍一下本次实验的环境: ...

  10. Java语言基础(六)

    Java语言基础(六) 前一章提到的, BigDecimal, DecimalFormat等具体用法,这里就不在说了,网上有许多 一.下面让我们看一个例子(自由落体运动位移) 说明: (1).公式是 ...