springmvc接口接收参数与请求参数格式
前言: 相信大家在刚开始接触接口定义与调用时遇到过接口接收不到请求参数的问题,本人也一样,使用springmvc去定义接口或调用第三方http接口时或多或少会搞混;下面咱们一起来整理下接口定义和请求参数格式的关系。
一、首先我们需要认识下http请求中的Content-Type
我们常用的有以下几种:
1、application/x-www-form-urlencoded; charset=UTF-8,浏览器的原生 form 表单,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key和value都进行了URL转码。
2、multipart/form-data:使用表单上传文件时,必须设置 form 的 enctyped 属性。
3、application/json; charset=utf-8,请求参数是序列化后的json格式字符串,方便提交复杂结构的数据,特别适合RESTful 的接口。
二、注解@RequestParam(value=“id”)
1、常用来处理地址栏传参和表单提交的参数绑定,Content-Type为application/x-www-form-urlencoded编码的内容,提交方式GET、POST
2、如果用java发送http请求,需采用key、value传参方式发送数据,如下写法:
public static String post(HttpClient httpClient, String url, Mapparams, Map headers) throws ClientProtocolException, IOException { logger.info("Ready Post Request Url[{}]", url); HttpPost post = new HttpPost(url); setHttpHeaders(post, headers); List nameValuePairList = new ArrayList (); for (Map.Entry entry : params.entrySet()) { nameValuePairList.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); } UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nameValuePairList, Consts.UTF_8); post.setEntity(entity); HttpResponse response = httpClient.execute(post); if (null == response || response.getStatusLine() == null) { logger.info("Post Request For Url[{}] is not ok. Response is null", url); return null; } else if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { logger.info("Post Request For Url[{}] is not ok. Response Status Code is {}", url, response.getStatusLine().getStatusCode()); return null; } return EntityUtils.toString(response.getEntity()); }
三、注解@RequestBody
1、一般用来接收json格式数据,后端直接定义好请求参数的bean,Content-Type为application/json; charset=utf-8,使用示例:
@RequestBody User user
请求参数:
{ "id": 1, "userName": "bryant", "password": "123456", "name": "kobe", "Date": "1990-02-27" }
2、使用java发送请求代码示例:
public static String post(HttpClient httpClient, String url, String content, Mapheaders) throws ClientProtocolException, IOException { logger.info("Ready Post Request Url[{}]", url); url = url.replaceAll(" ", "%20"); HttpPost post = new HttpPost(url); setHttpHeaders(post, headers); StringEntity entity = new StringEntity(content, Constants.CHARSET_UTF8); post.setEntity(entity); HttpResponse response = httpClient.execute(post); if (null == response || response.getStatusLine() == null) { logger.info("Post Request For Url[{}] is not ok. Response is null", url); return null; } else if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { logger.info("Post Request For Url[{}] is not ok. Response Status Code is {}", url, response.getStatusLine().getStatusCode()); return null; } return EntityUtils.toString(response.getEntity(), "utf-8"); } public static void main(String[] args) throws IOException { Map map = new HashMap<>(); map.put("empId", "1"); map.put("empName", "测试用户"); map.put("empEmail", "[email protected]"); Map head = new HashMap<>(); // 一定要设置参数格式 head.put("Content-Type", "application/json;charset=UTF-8"); System.out.println(HttpCaller.post(HttpClients.createDefault(), "http://localhost:8080/user/add", JsonUtil.toJson(map), head)); }
3、如果使用postman调试接口,需要设置传参方式为raw-JSON,如下图:
springmvc接口接受前端传递参数数据类型总结
一、springMVC中controller参数是自动注入
在springMVC中,controller中方法的参数是自动注入的,在使用注解的方式下,通常有:
@RequestParam
:取querystring当中的参数@PathVariable
:取 在@RequestMapping中定义的占位符中的参数(/test/{id})@RequestBody
:取request 这个消息体 (可以组装json对象)
在不使用注解的情况下,默认有一些对象可以自动注入如:
HttpServletRequest
HttpServletResponse
MultipartFile
MultipartRequest
除此之外不使用注解的情况下,也可以接受前台传入的querystring中的参数。
二、 接受前端传递的对象
1、从querystring中的参数中获取
@RequestParam:接受对象类型(Integer、String、Boolean等基本数据类型),不能接收自定义类型。
不带注解:接受基本数据类型,若接收类型为自定义类型,会组装参数中与自定义类型属性名和类型相符的参数。
这种方式总结:
(1).获取自定义类型的对象时,不使用注解即可以获取
(2).在组装对象时可以使用以被获取过的参数
注意:$.ajax contenType是appliation/json的时候,在后台用spring mvc的@Requestparam注解接收参数,始终接收不到。因为@RequestParam 底层是通过request.getParameter方式获得参数的,也就是说,@RequestParam 和 request.getParameter是同一回事。
所以@RequestParam可以处理get 方式中queryString的值,也可以处理post方式中 body data的值。@RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容(及表单内容数据),提交方式GET、POST。
2、从请求体(body)中获取(及获取对象数据)
当请求体中是一段json数据时,@RequestBody会解析该json字符串并将其注入指定的自定义类型中。
通过@RequestBody的方式可以接收以json数据传输的对象,但前提是请求的Content-Type必须为application/json,并且引入了jackson-databind包
注意:
1.@RequestBody该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;
2.@RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。在ajax请求往往传的都是Json对象,用 JSON.stringify(data)的方式就能将对象变成字符串。
3.不使用@RequestBody注解时,可以接收Content-Type为application/x-www-form-urlencoded类型的请求所提交的数据,数据格式:aaa=111b b b = 222 。 f o r m 表 单 提 交 以 及 j Q u e r y 的 bbb=222。form表单提交以及jQuery的bbb=222。form表单提交以及jQuery的.post()方法所发送的请求就是这种类型。例如后台接口接收数据的对象前不加@RequestBody修饰。
3、接收前端传递的数组
接收数组可以使用注解方式的@RequestParam、@RequestBody或者无注解的方式,也可以同时使用他们三个
在接受数组时,默认按照方法的参数名来映射请求的参数,目前很多前端框架喜欢传递数组时在请求参数后面加上"[]",所以使用@RequestParam时可以规定value使之对应如@RequestParam(“ids[]”) Integer[] ids。
三、小结一下
由上可知道,后台需要处理什么数据,或者需要前台需要传递什么类型的数据时,我们既可以根据这些特性来判断,而不会导致有时contentType不一致,甚至不知道自己需要前端传什么样类型的数据格式等等。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。