Content-Type /AJAX /@ResponseBody

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)

MIME类型

  • 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"};

image-20200812180112935

application/x-www-form-urlencoded 作为表单提交中默认的类型,其表明数据以标准的编码格式被编码为键值对。 数据被编码成以 '&' 分隔的键-值对, 同时以 '=' 分隔键和值. 非字母或数字的字符会被 percent-encoding: 这也就是为什么这种类型不支持二进制数据的原因 (应使用 multipart/form-data 代替)。参数中的中文都被url编码成了支持的字符

image-20200812175721197

multipart/form-data 这里为了对比,就也放到这里来说了。
一般用于涉及文件的表单提交,用于post请求,其格式如下

Content-Type: multipart/form-data; boundary=aBoundaryString

其中boundary指明了请求体中每部分的分割符(对于multipart的类目,都会存在该字段,以区分请求体中数据的分割),其请求体中则是对应表单每部分的内容。每部分都会有自己的请求体和相关内容。multipart可以上传多个不同的contentType的文件,一个请求头对应多个请求体
例如如下的文档结构:

image-20200812180437870

正如上文所述,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参数为trueNote: 在远程请求时(不在同一个域下),所有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

image-20200812182322133

@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接受。

原文地址:https://www.cnblogs.com/land-fill/p/13492808.html