您的位置:首页 > 理论基础 > 计算机网络

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起作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息