@RequestBody的正确使用方法
2016-04-15 11:53
411 查看
最近在接收一个要离职同事的工作,接手的项目是用SpringBoot搭建的,其中看到了这样的写法:
这个是一个请求映射方法,然后用浏览器输入url:http://127.0.0.1:8080/test/doThis?id=1&back_url=url&json_data={"code":2,"message":"test"}
在这个方法中,使用@RequestParam获取参数,然后使用@RequestBody对json格式的参数转换为Java类型
在运行的时候发现报错:Required request body is missing
@RequestBody的使用需要加载MappingJackson2HttpMessageConverter,但是SpringBoot的官方文档提到,这个是默认已经加载的了,而且json字符串和javabean也没有书写的错误
因此考虑到应该是请求Content-Type的问题,因为使用浏览器输入url的方式没有办法定义Content-Type,因此spring无法发现request body
为了证实这个想法,自己书写一个请求类:
请求还是失败,经过调试,发现需要去掉所有的@RequestParam注解才能成功
总结:
1、@RequestBody需要把所有请求参数作为json解析,因此,不能包含key=value这样的写法在请求url中,所有的请求参数都是一个json
2、直接通过浏览器输入url时,@RequestBody获取不到json对象,需要用java编程或者基于ajax的方法请求,将Content-Type设置为application/json
@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"}
在这个方法中,使用@RequestParam获取参数,然后使用@RequestBody对json格式的参数转换为Java类型
在运行的时候发现报错:Required request body is missing
@RequestBody的使用需要加载MappingJackson2HttpMessageConverter,但是SpringBoot的官方文档提到,这个是默认已经加载的了,而且json字符串和javabean也没有书写的错误
因此考虑到应该是请求Content-Type的问题,因为使用浏览器输入url的方式没有办法定义Content-Type,因此spring无法发现request body
为了证实这个想法,自己书写一个请求类:
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注解才能成功
总结:
1、@RequestBody需要把所有请求参数作为json解析,因此,不能包含key=value这样的写法在请求url中,所有的请求参数都是一个json
2、直接通过浏览器输入url时,@RequestBody获取不到json对象,需要用java编程或者基于ajax的方法请求,将Content-Type设置为application/json
相关文章推荐
- 优先队列(priority_queue)
- angular 系列八 ui-router详细介绍及ngRoute工具区别
- @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
- iOS UITextFieldDelegate 代理方法小结
- 导航栏使用不透明的图片时,控制器view的y值
- 关于SSIS包调用,把Execute out of Process 设成True后运行失败问题
- 详解iOS开发中UITableview cell 顶部空白的多种设置方法
- UIBezierPath类简介
- freemarker 获取select的value和内容
- UESTC 1137 邱老师选妹子
- Your build settings specify a provisioning profile with the UUID
- Quartz Quick Start Guide
- 设置UIView的对象不透明
- UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 683: illegal multibyte sequence
- ui/ue设计师应该了解的原型设计软件
- easyui实现鼠标移到某一行,就会弹出一个提示信息效果
- Android Gradle插件(plugin)版本(version)与Gradle、SDK Build Tools版本关系
- UI/UE/ID/UED/UCD的区别
- MySQL查询报错 ERROR: No query specified
- 交互设计谁是最好用的原型绘制工具