ajax发送json数据时为什么需要设置contentType:为什么要用ajax
applicationjson”
1. ajax发送json数据时设置contentType: "application/json”和不设置时到底有什么区别?
contentType: "application/json”,⾸先明确⼀点,这也是⼀种⽂本类型(和text/json⼀样),表⽰json格式的字符串,如果ajax中设置为该类型,则发送的json对象必须要使⽤JSON.stringify进⾏序列化成字符串才能和设定的这个类型匹配。同时,对应的后端如果使⽤了Spring,接收时需要使⽤@RequestBody来注解,这样才能将发送过来的json字符串解析绑定到对应的 pojo 属性上。另外,需注意⼀点,json字符串在书写时名称部分需要加上“”双引号,以免⼀些json解析器⽆法识别。
如ajax 请求时不设置任何contentType,默认将使⽤contentType: "application/json”application/x-www-form-urlencoded,这种格式的特点就是,name/value 成为⼀组,
每组之间⽤ & 联接,⽽ name与value 则是使⽤ = 连接。如: www.baidu/query?user=username&pass=password 这是get请求, ⽽ post 请求则是使⽤请求体,参数不在 url 中,在请求体中的参数表现形式也是: user=username&pass=password的形式。使⽤这种contentType 时,对于简单的json对象类型,如:{“a”:1,"b":2,"c":3} 这种,将也会被转成user=username&pass=password 这种形式发
送到服务端。⽽服务端接收时就按照正常从from表单中接收参数那样接收即可,不需设置@RequestBody之类的注解。但对于复杂的json 结构数据,这种⽅式处理起来就相对要困难,服务端解析时也难以解析,所以,就有了application/json 这种类型,这是⼀种数据格式的申明,明确告诉服务端是什么格式的数据,服务端只需要根据这种格式的特点来解析数据即可。
总结:
1).ajax 如果发送的是json字符串,服务端接收时必须要使⽤@RequestBody注解。始终记住,json字符
串,"application/json”,@RequestBody 这三者之间是⼀⼀对应的,要有都有,要没有都没有。
2).如果发送的是json对象,contentType不能设置为"application/json”,需使⽤默认的类型(application/x-www-form-urlencoded,为什么呢?这种类型最后还是会把json对象类型的参数转为user=username&pass=password这种形式后再发送,需要明⽩⼀点:这种转换时只能识别json对象类型,不能识别json字符串类型)。
2.application/x-www-form-urlencoded 和 application/json 两种类型的数据在后端如何接收并解析?
application/x-www-form-urlencoded 这种类型的参数提交⽅式有get和post两种,这两种⽅式的区别是前者把编码后的
user=username&pass=password这种形式的参数放在url上进⾏提交,后者是放在请求报⽂的请求体部分进⾏发送,只是发送数据时数据放的位置不⼀样。服务端收到 user=username&pass=password 这种形式的参数后,原⽣的Servlet使⽤Parameter(“user”)的这种形式即可获取参数,spring mvc 中框架可⾃动根据参数名进⾏匹配,即表单元素的name属性和接收参数的名称⼀样时即可⾃动匹配,如果不⼀样,还可以使⽤@RequestParam的⽅式匹配。
application/json 字符串数据原⽣的Servlet中可以使⽤ParameterMap()来获取,但需注意,这种只能获取Get⽅式传⼊的数据。post传⼊的需要使⽤输⼊流的⽅式来读取。在spring mvc中通过@RequestBody来解析并绑定json字符串参数到⽅法⼊参。
@RequestBody 注解详解
作⽤:
1) 该注解⽤于读取Request请求的body部分数据,使⽤系统默认配置的HttpMessageConverter进⾏解析,然后把相应的数据绑定到要返回的对象上;
2) 再把HttpMessageConverter返回的对象数据绑定到 controller中⽅法的参数上。
使⽤时机:
A) GET、POST⽅式提时,根据request header Content-Type的值来判断:
1)application/x-www-form-urlencoded,可选(即⾮必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然
@RequestBody也能处理);
2)multipart/form-data, 不能处理(即使⽤@RequestBody不能处理这种格式的数据);
3)其他格式,必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使⽤@RequestBody来处理);
B) PUT⽅式提交时,根据request header Content-Type的值来判断:
application/x-www-form-urlencoded,必须;multipart/form-data, 不能处理;其他格式,必须.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论