springmvc中的http请求参数与响应
2016-11-22 17:12
176 查看
springmvc我想大家都会觉得特别简单,心想不就是接收请求,响应请求嘛!以下谈谈我在开发项目中遇到的一些坑,都是因为概念模糊,知识不准确导致的问题。
首先说一下,http参数的类型,关于文本的类型主要是三种,url后面的参数,post方式的表单参数,这种参数是在请求体中,还有就是ajax调用时,用的json格式的参数,也是在请求体中。以前有一个误解,认为表单如果是post的方式,请求体中的参数就一定是json,后来发现不对,request body中的参数格式跟content-type有关,表单默认的格式是x-www-form-urlencoded,这个时候请求体里的参数是key=value&key=value,跟url中的参数格式是一样的。如果content-type是application/json的话,请求体中的参数就必须是json格式的。最后,请大家注意一点:get方法中是不能有request
body的,也就意味着请求头中不能有content-type参数。
说完参数类型之后 ,再来看springmvc如何接收参数。众所周知,springmvc接收参数都是用的方法中的参数直接接收的,但是接收的方式有很大不同。如果是表单格式的参数,无论是url中的还是request body中的,我们要么可以分开单个参数接收,或者直接用个对象一起接收(不可以加@RequestBody注解,如果加了,会报415错误)。注意:不能用map对接接收,多个参数不会自动组成map对象。在这里说一下,@RequestParam注解如果用在某个参数前面,则这个参数必须存在,如果不存在就会报400错误,因为这个注解默认就是参数必须存在,或者设置required属性为false。另外,不要用基本类型来接收参数,因为如果参数不存在,也会报异常:Optional
int parameter 'id' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.意思是无法将null转换为基本类型。所以接收参数要用对象类型的参数来接收,最坏也就是接收一个null值。
对于json格式的参数,首先这种参数不能单个接收,必须要用一个对象整体接收,另外接收参数必须要用@RequestBody注解。并且json格式的字符串可以用map接收,@RequestBody是可以将json参数转换成map的。如果不想用对象接收,或者说没有现成的对象能够接收怎么办,一是可以用map,另外可以用String类型来接收,直接把整个json字符串接收下来,前面也要加上@RequestBody注解,如:@RequestBody
String s,这样就可以把整个参数字符串接收下来,再用json工具类转换为对象。在json中数据是分类型的,与js中的类型是一致的,比如说不加引号的1就是数字类型,加上引号就是字符串。但是我们在接收参数时,这些都不用关心,因为有@RequestBody注解,他都帮我们做了转换,也就是说我们用什么类型接收都可以。最后提一下Model,这个类型是不能接收任何参数的,只是用来存储request属性的。所以千万不要误用。
最后说一下,@RequestBody的原理,它的实质是一个消息转换器,MessageConverter,这个我们可以在springmvc中的配置,但是不建议大家配,因为springmvc默认使用的就是jackson来处理的,大家都知道jackson就是用来处理json的,所以这也就是为什么提交表单时,请求体中的参数不能用@RequestBody,因为格式不是json。
关于响应就想说两点,如果是返回视图,就不要用@ResponseBody,因为用了这个,就把响应数据弄成json了,不会返回视图。另外不要在返回视图的controller上面加@RestController,因为这样一弄,所有的方法返回的都是json字符串了,除非是做前后端分离,返回的都是json类型的接口。另外,如果要让类上的@ResponseBody起作用,springmvc的配置中必须要加<mvc:annotation-driven
/>,否则默认只有方法上的@ResponseBody起作用。
首先说一下,http参数的类型,关于文本的类型主要是三种,url后面的参数,post方式的表单参数,这种参数是在请求体中,还有就是ajax调用时,用的json格式的参数,也是在请求体中。以前有一个误解,认为表单如果是post的方式,请求体中的参数就一定是json,后来发现不对,request body中的参数格式跟content-type有关,表单默认的格式是x-www-form-urlencoded,这个时候请求体里的参数是key=value&key=value,跟url中的参数格式是一样的。如果content-type是application/json的话,请求体中的参数就必须是json格式的。最后,请大家注意一点:get方法中是不能有request
body的,也就意味着请求头中不能有content-type参数。
说完参数类型之后 ,再来看springmvc如何接收参数。众所周知,springmvc接收参数都是用的方法中的参数直接接收的,但是接收的方式有很大不同。如果是表单格式的参数,无论是url中的还是request body中的,我们要么可以分开单个参数接收,或者直接用个对象一起接收(不可以加@RequestBody注解,如果加了,会报415错误)。注意:不能用map对接接收,多个参数不会自动组成map对象。在这里说一下,@RequestParam注解如果用在某个参数前面,则这个参数必须存在,如果不存在就会报400错误,因为这个注解默认就是参数必须存在,或者设置required属性为false。另外,不要用基本类型来接收参数,因为如果参数不存在,也会报异常:Optional
int parameter 'id' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.意思是无法将null转换为基本类型。所以接收参数要用对象类型的参数来接收,最坏也就是接收一个null值。
对于json格式的参数,首先这种参数不能单个接收,必须要用一个对象整体接收,另外接收参数必须要用@RequestBody注解。并且json格式的字符串可以用map接收,@RequestBody是可以将json参数转换成map的。如果不想用对象接收,或者说没有现成的对象能够接收怎么办,一是可以用map,另外可以用String类型来接收,直接把整个json字符串接收下来,前面也要加上@RequestBody注解,如:@RequestBody
String s,这样就可以把整个参数字符串接收下来,再用json工具类转换为对象。在json中数据是分类型的,与js中的类型是一致的,比如说不加引号的1就是数字类型,加上引号就是字符串。但是我们在接收参数时,这些都不用关心,因为有@RequestBody注解,他都帮我们做了转换,也就是说我们用什么类型接收都可以。最后提一下Model,这个类型是不能接收任何参数的,只是用来存储request属性的。所以千万不要误用。
最后说一下,@RequestBody的原理,它的实质是一个消息转换器,MessageConverter,这个我们可以在springmvc中的配置,但是不建议大家配,因为springmvc默认使用的就是jackson来处理的,大家都知道jackson就是用来处理json的,所以这也就是为什么提交表单时,请求体中的参数不能用@RequestBody,因为格式不是json。
关于响应就想说两点,如果是返回视图,就不要用@ResponseBody,因为用了这个,就把响应数据弄成json了,不会返回视图。另外不要在返回视图的controller上面加@RestController,因为这样一弄,所有的方法返回的都是json字符串了,除非是做前后端分离,返回的都是json类型的接口。另外,如果要让类上的@ResponseBody起作用,springmvc的配置中必须要加<mvc:annotation-driven
/>,否则默认只有方法上的@ResponseBody起作用。
相关文章推荐
- 解决 AngularJs $http 发送post,get请求,SpringMvc无法接受参数的问题。
- http请求使用patch,后台Springmvc处理请求参数问题
- http请求后台springMvc中获取不到请求参数
- java实现:http协议get和post方法的url参数请求响应及交互
- [SpringMVC 源码] HTTP 请求与响应过程
- AngularJs中$http发送post或者get请求,SpringMVC后台接收不到参数值的解决办法
- springMVC中HTTP PUT请求该如何传输请求参数呢?
- springmvc中随时获得request(这种情况在为文件MultipartHttpServletRequest的请求下可以获得参数)
- SpringMVC请求参数和响应结果全局加密和解密
- Http协议中关于请求与响应中文参数乱码问题详解
- AngularJs中$http发送post或者get请求,SpringMVC后台接收不到参数值的解决办法
- Http消息头、请求头、响应头、参数、cookie和响应内容——别说话,看题就行了
- SpringMVC之http的请求响应模型(三)
- HTTP协议请求和响应各参数
- java 模拟HTTP doPost请求 设置参数
- http 请求响应码
- 理解HTTP协议的Request/Response(请求响应)模型
- HTTP-请求和响应格式
- 【C#】进行HTTP请求需要设置的参数
- HTTP数据请求与响应