Content-Type

Content-Type

Content-Type(MediaType),即是Internet Media Type,互联网媒体类型,也叫做MIME类型。在互联网中有成百上千中不同的数据类型,HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签,用于区分数据类型

在HTTP协议消息头中,使用Content-Type来表示请求和响应中的媒体类型信息。它用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析并展示html等等。

Content-Type的格式:
Content-Type:type/subtype ;parameter

type:主类型,任意的字符串,如text,如果是*号代表所有;
subtype:子类型,任意的字符串,如html,如果是*号代表所有,用“/”与主类型隔开;
parameter:可选参数,如charset,boundary等。

例如:
Content-Type: text/html;
Content-Type: application/json;charset:utf-8;

MIME 类型 描述
text/plain 纯文本文档
text/html HTML 文档
text/javascript JavaScript 文件
text/css CSS 文件
application/json JSON 文件
application/pdf PDF 文件
application/xml XML 文件
image/jpeg JPEG 图像
image/png PNG 图像
image/gif GIF 图像
image/svg+xml SVG 图像
audio/mpeg MP3 文件
video/mpeg MP4 文件

application/json

现在越来越多的应用使用application/json,用来告诉服务端消息主体是序列化的json字符串。由于json规范的流行,各大浏览器都开始原生支持JSON.stringfy。

而且spring对这个content-Type上传的数据有很好的支持,可以直接通过@RequestBody进行接收。也是当前完美适配当前流行的RestApi。

JSON 是一种轻量级的数据格式,以“键-值”对的方式组织的数据。使用这个类型,需要参数本身就是json格式的数据,参数会被直接放到请求实体里,不进行任何处理。服务端/客户端会按json格式解析数据(约定好的情况下)。

请求参数

http 请求报文

application/x-www-form-urlencoded

在最开始的请求方式中,请求参数都是放在url中,表单提交的时候,都是以key=&value=的方式写在url后面。这也是浏览器表单提交的默认方式。

不支持文件,一般用于表单提交。

  • 请求参数
  • http 请求报文

multipart/form-data

简介

此种方式多用于文件上传,表单数据都保存在http的正文部分,各个表单项之间用boundary分开。

与application/x-www-form-urlencoded不同,这是一个多部分多媒体类型。首先生成了一个 boundary 用于分割不同的字段,在请求实体里每个参数以——boundary开始,然后是附加信息和参数名,然后是空行,最后是参数内容。多个参数将会有多个boundary块。如果参数是文件会有特别的文件域。最后以——boundary–为结束标识。multipart/form-data支持文件上传的格式,一般需要上传文件的表单则用该类型。

下面是一个例子:

  • 请求参数
  • http 请求报文

Content-Disposition 是必选项, name 属性代表着表单元素的 keyfilename 则是上传文件的名称

为什么需要 FormData

application/json 作为请求头 Content-Type 字段值时,表示告知服务端参数是序列化后的 JSON 字符串,所以一般在传参时都会用 JSON.stringify 序列化一下,但是 JSON.stringify 在转换某一些数据结构时会出问题,比如 会丢失 function 类型的参数、循环引用时会报错、**Blob /File 对象会被转化成 {}** 等等。

如果要是图片那可以转换成 base64 格式进行上传解决,这种方式虽然可行,但是转换成 base64 格式需要很多字符,占用很多资源,而且很长,不便于阅读,另外就是服务端接收到这个参数还得解析,很麻烦,此时,FormData 就可用上了。

使用 FormData

window 上直接挂载了 FormData 对象

我们一般都使用 append 方法

append 和 set 的区别:

appendkey 存在,就会附加到已有值集合的后面,而 set 会使用新值覆盖已有的值

参考

https://blog.csdn.net/a772116804/article/details/114586937

https://juejin.cn/post/7057293668440834061


Content-Type
http://example.com/2022/09/04/FormData/
Author
John Doe
Posted on
September 4, 2022
Licensed under