Content-Type
Content-Type(内容类型),(Mime-Type)一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。用于指示资源的MIME类型,如果未指定 ContentType,默认为text/html 有两种场景: 在请求中 (如POST 或 PUT),客户端告诉服务器实际发送的数据类型。
在request请求中是告诉服务器发送给服务器的内容类型。在response请求中是服务器告诉浏览器传输过来的是什么类型,浏览器根据该类型来决定怎么解析发过来的资源。
参数一般media-type、charset、boundary三种。 我们的关注点在于media-type的取值以及其适用场景。
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
一个MIME类型至少包括两个部分:一个类型(type)和一个子类型(subtype)
- text/html : HTML格式
- text/plain :纯文本格式
- text/xml : XML格式
- image/gif :gif图片格式
- image/jpeg :jpg图片格式
- image/png:png图片格式
以application开头的媒体格式类型:
- application/xhtml+xml :XHTML格式
- application/xml: XML数据格式
- application/atom+xml :Atom XML聚合格式
- application/json: JSON数据格式
- application/pdf:pdf格式
- application/msword : Word文档格式
- application/octet-stream : 二进制流数据(如常见的文件下载)
- application/x-www-form-urlencoded :
<form encType="">
中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
另外一种常见的媒体格式是上传文件之时使用的:
- multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
application/json
随着json这种轻量级的数据交互格式的流行,特别是和脚本交互的便利,使得在前后接口中,越来越多采用json格式。对于http协议来说,最终传输的还是字符。这里不再多进行描述。
{name: "John", age: 31, city: "New York"};
application/x-www-form-urlencoded 作为表单提交中默认的类型,其表明数据以标准的编码格式被编码为键值对。 数据被编码成以 '&' 分隔的键-值对, 同时以 '=' 分隔键和值. 非字母或数字的字符会被 percent-encoding: 这也就是为什么这种类型不支持二进制数据的原因 (应使用 multipart/form-data 代替)。参数中的中文都被url编码成了支持的字符
multipart/form-data 这里为了对比,就也放到这里来说了。
一般用于涉及文件的表单提交,用于post请求,其格式如下
Content-Type: multipart/form-data; boundary=aBoundaryString
其中boundary指明了请求体中每部分的分割符(对于multipart的类目,都会存在该字段,以区分请求体中数据的分割),其请求体中则是对应表单每部分的内容。每部分都会有自己的请求体和相关内容。multipart可以上传多个不同的contentType的文件,一个请求头对应多个请求体
例如如下的文档结构:
正如上文所述,multipart一般对应单个消息头对应多个消息体。 常见语法如下:
Content-Type: multipart/mixed; boundary=gc0p4Jq0M2Yt08jU534c0p
其中boundary字段是必须的,用于区分消息体中的数据边界,一般是两个'-'的格式作为该端的开头,例如:
--gc0p4Jq0M2Yt08jU534c0p
JQuery中的Ajax请求的参数
data
类型: [Object, String](https://www.jquery123.com/Types/#Object, String)
发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后面。查看 processData
选项说明,以禁止此自动转换。对象必须为"{键:值}"格式。如果这个参数是一个数组,jQuery会按照traditional
参数的值, 将自动转化为一个同名的多值查询字符串(查看下面的说明)。注:如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。
processData (默认: true
)
类型: Boolean
默认情况下,通过data选项传递进来的数据,如果是一个对象(技术上讲只要不是字符串),都会处理转化成一个查询字符串,以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false
。
dataType (默认: Intelligent Guess (xml, json, script, or html)
)
类型: String
预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如XML MIME类型就被识别为XML。在1.4中,JSON就会生成一个JavaScript对象,而script则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。可用值:
- "xml": 返回 XML 文档,可用 jQuery 处理。.
- "html": 返回纯文本 HTML 信息;包含的script标签会在插入dom时执行。
- "script": 把响应的结果当作 JavaScript 执行。并将其当作纯文本返回。默认情况下不会通过在URL中附加查询字符串变量 "_=[TIMESTAMP]" 进行自动缓存结果,除非设置了
cache
参数为true
。Note: 在远程请求时(不在同一个域下),所有POST请求都将转为GET请求。(因为将使用DOM的script标签来加载) - "json": 把响应的结果当作 JSON 执行,并返回一个JavaScript对象。在 jQuery 1.4 中,JSON 格式的数据以严格的方式解析,如果格式有错误,jQuery都会被拒绝并抛出一个解析错误的异常。(见json.org的更多信息,正确的JSON格式。)
- "jsonp": 以 JSONP 的方式载入 JSON 数据块。会自动在所请求的URL最后添加 "?callback=?"。默认情况下不会通过在URL中附加查询字符串变量 "_=[TIMESTAMP]" 进行自动缓存结果,除非将
cache
参数设置为true
。 - "text": 返回纯文本字符串。
contentType (默认: 'application/x-www-form-urlencoded; charset=UTF-8'
)
类型: String
发送信息至服务器时内容编码类型。默认值是"application/x-www-form-urlencoded; charset=UTF-8",适合大多数情况。如果你明确地传递了一个内容类型(Content-Type)给 $.ajax()
,那么他必定会发送给服务器(即使没有数据要发送)。数据将总是使用UTF-8字符集传递给服务器;你必须在服务器端进行适当的解码。
ajax请求中如果不设置ContentType 默认进去urlencode 如果这时候在controller中写了RequestBody注解,就会报错
415
@RequestBody
https://blog.csdn.net/justry_deng/article/details/80972817
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
RequestBody 接收的是请求体里面的数据;而RequestParam接收的是key-value里面的参数
后端@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为
- json字符串中,如果value为""的话,后端对应属性如果是String类型的,那么接受到的就是"",如果是后端属性的类型是Integer、Double等类型,那么接收到的就是null。
- json字符串中,如果value为null的话,后端对应收到的就是null。
- 如果某个参数没有value的话,在传json字符串给后端时,要么干脆就不把该字段写到json字符串中;要么写value时, 必须有值,
"key":null
或"key":""
都行。不能写成"key":
如果没有使用@RequestBody注解,那么一个复杂对象User,需要从key-value中找和属性名相同的key进行封装,如果这时候浏览器传过来的是一个json字符串,就不能进行自动封装,因此如果浏览器端传过来的json,需要从使用@RequestBody接受。