@RequestParam
在SpringMVC中,RequestParam注解接收的参数是来自于requestHeader中,即请求头,也就是在url中。格式为xxx?username=123&password=456
@RequestBody
而@RequestBody注解接收的参数则是来自于requestBody中,即请求体中。
如果为post请求时,后台接收参数时注意区分:
1、请求中content-type为application/json,参数提交形式为Request Payload时,需要使用注解@RequestBody
2、请求中content-type为application/x-www-form-urlencoded,参数提交形式为Form Data时,无需使用注解,可以直接拿实体类接收参数
几种方式的请求入参对应后端接口的参数接收:
补充一:application/x-www-form-urlencoded和application/json的区别
application/x-www-form-urlencoded
在html的form元素的语法中,EncType表明提交数据的格式用Enctype属性,指定将数据发到服务器时浏览器使用的编码类型。下边是说明:
1、application/x-www-form-urlencoded:表单数据被编码为名称/值对,这是标准的编码格式,也是默认的
2、multipart/form-data:表单数据被编码为一条消息,页上的每个控件对应消息中的一个部分
3、text/plain:表单数据以纯文本形式进行编码,其中不含任何控件或格式字符
当请求方式为GET时,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载成这个新的url。
当请求方式为POST时,浏览器把form数据封装到HTTP body中,然后发送到服务端。如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。
application/json
有的时候前端发送的请求中 content-type为application/json,这样也能在后台接受前台提交的数据。其实这个时候前端提交的数据是 json格式的字符串,后端要用@RequestBody注解来接收。
补充二:@RequestBody
RequestBody注解接收的参数是一个String化的JSON,前端JS可以直接使用JSON.stringify(jsonObject)这个方法来转换JS中的JSON对象为JSON字符串。
该注解用于Controller的方法参数,根据htttp请求的Request Headers中的Content-Type的内容,通过适当的HttpMessageConverter转换为java实体。所以后台无需手动进行JSON与实体的转换。只要能映射上去(字段名和JSON的key相对应,value可以匹配上相应的数据类型)就可以直接转换,所以可以直接使用java对象接收参数。
由上我们可以知道,后端使用@RequestBody注解接收参数时,我们需要手动设置前端请求头中的content-type为application/json,明确的告诉服务器发送的内容是JSON,如果不设置这个属性,请求就会采用默认的content-type(application/x-www-form-urlencoded;charset=UTF-8)。