对于HTTP协议来说,好多不是计算机网络专业的朋友来说不是很熟悉,特别是针对其中的一些语法也感觉莫名其妙,其实HTTP协议中也是有一定的语法规则的(其实就是一些硬性规定,比如我们日常生活中自然语言的一些规定:好样的的是褒义词,笨蛋是贬义词),Content-Type就是HTTP协议中用来规定一些文件类型的,传输过程中根据设置好的Content-Type就可以知道要处理的内容是什么类型
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
可以看出来语法结构为:type/subtype(;parameter=value) 不允许空格存在,对大小写不敏感,但传统都是小写
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的
Application:用于传输应用程序数据或者二进制数据,例如application/octet-stream,application/pdf,application/pkcs8,application/zip
Image:图像或图形数据,包括位图和矢量图像以及动画图像,例如image/gif, image/png, image/jpeg, image/bmp, image/webp, image/x-icon
Audio:用于传输音频或者音声数据,例如audio/mpeg, audio/vorbis
Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式,例如video/mp4
Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据,由多个不同MIME类型组件构成的数据,例如 multipart/form-data(由多种内容类型进行传输,可能既包括多媒体内容,又包括数据内容)
Message:一个包括多种内容类型的消息,常用于下面的场景,例如指明一个邮件包含转发信息或者在多种信息的情况下,允许以chunk的形式发送数据量很大的信息。包括message/rfc822和message/partial,一般用于包装一个E-mail消息
$.ajax({ method:"post", url:"http://www.w3capi.com/test", contentType:"application/json;charset=utf-8", data:{ 'title':'test', 'sub' : [1,2,3] } });
最终发送请求的格式为:
POST http://www.w3capi.com/test HTTP/1.1 Content-Type: application/json;charset=utf-8 {"title":"test","sub":[1,2,3]}
三、multipart/form-data
<form action="/Index/test" enctype="multipart/form-data" method="post"> <input type="file" name="file_data" /> <input type="submit" value="测试提交" /> </form>
POST http://www.w3capi.com/Index/test HTTP/1.1 Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryusAwgDgO8X0WGuvH ------WebKitFormBoundaryusAwgDgO8X0WGuvH Content-Disposition: form-data; name="file_data"; filename="test_img.jpg" Content-Type: image/jpeg ------WebKitFormBoundaryusAwgDgO8X0WGuvH--
根据请求可以看到,在Content-Type中声明了内容的类型为multipart/form-data,而后紧跟 boundary 参数的值 用于分割不同的字段,为了避免与正文内容重复,消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 ------boundary值 开始,紧接着内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 ------boundary值 结束。关于 mutipart/form-data 的详细说明,请前往 RFC1867 查看。