🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 简介 `content-type` 是 `HTTP` 的首部字段,用于指示资源的 MIME 类型,说明请求或返回的消息主体是用何种方式编码。 <br> 在响应中,`Content-Type` 标头告诉客户端实际返回的内容的内容类型。 <br> 在请求中, (如 `POST` 或 `PUT`),客户端告诉服务器实际发送的数据类型。 <br> ## 句法 ~~~ Content-Type: text/html; charset=utf-8 Content-Type: multipart/form-data; boundary=something ~~~ 上面列的两个Content-Type是通用的句法结构: * **text/html**,是指请求的 MIME(media-type),他分为两个部分 `type` 和 `subtype`,以“/”进行分割;`subtype` 是 `type` 的详细信息。例如 `text/plain` 中 `text` 指文本,`plain` 对 `text` 进一步限制,指纯文本。 常见的 type 有: * Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的; * Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据; * Application:用于传输应用程序数据或者二进制数据; * Message:用于包装一个E-mail消息; * Image:用于传输静态图片数据; * Audio:用于传输音频或者音声数据; * Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。 * **charset**:是指定字符编码的标准,常见的有"ISO-8859-1"、"UTF-8"、"GB2312“,”ASCII“等; * **boundary**:多用于上传文件时使用,用于分割数据; > MIME type (现在称为“媒体类型(media type)”,但有时也是“内容类型(content type)”)是指示文件类型的字符串,与文件一起发送(例如,一个声音文件可能被标记为 audio/ogg,一个图像文件可能是 image/png)。 它与传统Windows上的文件扩展名有相同目的。 # 常用类型 常见的 media-type 有: * text/html * text/plain * text/css * text/javascript * application/xml * application/x-www-form-urlencoded * application/json * multipart/form-data 前面的几种都比较简单,下面主要介绍一下后面几种类型。 ## application/x-www-form-urlencoded 这是最常见的 POST 提交数据的方式了。浏览器的原生 `<form>` 表单,如果不设置 `enctype` 属性,那么最终就会以 `application/x-www-form-urlencoded` 方式提交数据。 比如下面一个简单的表单: ~~~ <form action="http://homeway.me/post.php" method="POST"> <input type="text" name="name" value="homeway"> <input type="text" name="key" value="nokey"> <input type="submit" value="submit"> </form> ~~~ 首先,Content-Type 被指定为 `application/x-www-form-urlencoded`;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都会进行 URL 转码。 ## multipart/form-data 常见的 POST 数据提交的方式。我们使用表单上传文件时(type=file),必须让 form 的 enctype 等于这个值。如果上传照片,文件等,由于很多情况下都会有批量上传,为了区分不同的数据,multipart/form-data的类型有boundary参数进行分割, ~~~ <form action="/" method="post" enctype="multipart/form-data"> <input type="file" name="file1" value="some text"> <input type="file" name="file2"> <button type="submit">Submit</button> </form> 复制代码 ~~~ ~~~ ------WebKitFormBoundary18bktajg65CSIx4j Content-Disposition: form-data; name="files"; filename="test1.txt" Content-Type: text/plain this is file1; ------WebKitFormBoundary18bktajg65CSIx4j Content-Disposition: form-data; name="files"; filename="test2.txt" Content-Type: text/plain this is file2; ------WebKitFormBoundary18bktajg65CSIx4j-- 复制代码 ~~~ 上面请求是上传了两个文件,分别是 test1.txt 和test2.txt,文件内容分别是“this is file1;” 和 “this is file2;” 可以看到两个文件由于是文本,Content-Type 为 `text/plain`,`Content-Disposition` 中包含 `name` 和 `filename` 属性,name 是 form 表单提交内容里的 name 属性,文件之间有 `------WebKitFormBoundary18bktajg65CSIx4j` 这样一串字符隔开,这串字符就是 `boundary` 分割符,字符串随机生成不会与文本内容重复。 ## application/json `application/json` 是 POST 请求以 JSON 的格式向服务请求发起请求或者请求返回 JSON 格式的响应内容,服务端接收到数据后对 JSON 进行解析拿到所需要的参数。这也是现在用的比较多的一种形式。 ~~~ POST [http://www.example.com](http://www.example.com) HTTP/1.1 Content-Type: application/json;charset=utf-8 // body {"title":"test","sub":[1,2,3]} ~~~ # 参考资料 [理解HTTP之 content-type](https://juejin.im/post/5cacc5f2f265da035a1f004c)