最近在接收一个要离职同事的工做,接手的项目是用SpringBoot搭建的,其中看到了这样的写法:java
- @RequestMapping("doThis")
- public String doThis(HttpServletRequest request,
- @RequestParam("id") Long id, // 用户ID
- @RequestParam("back_url") String back_url, // 回调地址
- @RequestBody TestEntity json_data // json数据,对于java实体类
- ){//...
这个是一个请求映射方法,而后用浏览器输入url:http://127.0.0.1:8080/test/doThis?id=1&back_url=url&json_data={"code":2,"message":"test"}ajax
在这个方法中,使用@RequestParam获取参数,而后使用@RequestBody对json格式的参数转换为Java类型spring
在运行的时候发现报错:Required request body is missing编程
@RequestBody的使用须要加载MappingJackson2HttpMessageConverter,可是SpringBoot的官方文档提到,这个是默认已经加载的了,并且json字符串和javabean也没有书写的错误json
所以考虑到应该是请求Content-Type的问题,由于使用浏览器输入url的方式没有办法定义Content-Type,所以spring没法发现request body浏览器
为了证明这个想法,本身书写一个请求类:app
- String add_url = "http://127.0.0.1:8080/test/doThis";
- URL url = new URL(add_url);
- HttpURLConnection connection = (HttpURLConnection)url.openConnection();
- connection.setDoInput(true);
- connection.setDoOutput(true);
- connection.setRequestMethod("POST");
- connection.setUseCaches(false);
- connection.setInstanceFollowRedirects(true);
- connection.setRequestProperty("Content-Type","application/json");
- connection.connect();
- DataOutputStream out = new DataOutputStream(connection.getOutputStream());
- JSONObject obj = new JSONObject();
-
- obj.put("code", -1002);
- obj.put("message", "msg");
- out.writeBytes(obj.toString());
- out.flush();
- out.close();
请求仍是失败,通过调试,发现须要去掉全部的@RequestParam注解才能成功ui
总结:url
一、@RequestBody须要把全部请求参数做为json解析,所以,不能包含key=value这样的写法在请求url中,全部的请求参数都是一个jsonspa
二、直接经过浏览器输入url时,@RequestBody获取不到json对象,须要用java编程或者基于ajax的方法请求,将Content-Type设置为application/json