解决请求接口要以JSON格式请求后端的问题
一开始就跟平常一样写好接口就给前端。发现老是500方法进不来发现是请求头Content-Type的问题导致的
相关知识:
(1):我们默认使用的表单和Jquery默认的Ajax请求,Content-Type都是默认采用:application / x-www-form-urlencoded
(2):提交的数据按照username = qiu&password = 123的方式进行编码,key和val都进行了URL转码,
(3):现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的JSON字符串
(4):所以在(@RequestParam(value =“token”)String token,String columnId)这样是能获取的到数据的
1:在@RequestMapping()中加入produce =“application / json; charset = UTF-8”设置请求头为json格式
@RequestMapping(value = "queryDriverEvaluateById",produces = "application/json;charset=UTF-8")
@ResponseBody
发现还是500方法进不来 网上很多例子都是到这步有些就成功可以请求了,但是我的还是不行。
2:后来找到@RequestBody,来自于com.alibaba.fastjson
相关知识:
(1):@ RequestBody接收的是一个Json的对象的字符串
(2):@ RequestBody需要把所有请求参数作为JSON解析,因此,不能包含键=值这样的写法在请求URL中,所有的请求参数都是一个JSON
(3):直接通过浏览器输入URL时,@ RequestBody获取不到JSON对象,需要用的Java编程或者基于AJAX的方法请求,将内容类型设置为应用/ JSON
在参数上写@RequestBody JSONObject jsonObject
queryDriverEvaluateById(@RequestBody JSONObject jsonObject)
终于发现debug打断点不在报错了,方法进来了。
JSONObject在api中是用一个私有的常量map进行封装的,实际就是一个map,只不过FastJson对其进行了封装可以通过
String columnId = jsonObject.getString("columnId");
获取到数据。有点类似于当前学习Servlet一个一个获取参数(PS:其实就是Map键值对啦)。
3:虽然不在500报错连方法都进不来了。不过这样写1到两个参数还好,多了还不得累死!所以继续去找解决办法!
如果是多个参数,封装成一个对象,或者本来是一个对象。
能不能通过类似于Spring MVC直接在参数上写对象让框架请求初始化时自动去找设置方法注入属性值呢?
直接形参上写
@RequestBody DriverEvaluate driverEvaluate
传入的JSON格式字符串自动转为对象!
发现这样是可以做到的,有一点需要注意如果请求需要通过网络传输在实体内需要实现Serializable序列化。
JSON传输的请求格式如这样:
{
"qiujian": "112",
"password": "111",
"token": "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJqd3312312QiLCJpYXQiOjE1NDIwOTA1MTEsInN1YiI6IntcImpwYXBpXCI6XCJqcCFAI1wifSIsImV4cCI6MTU0MjA5MjMxMX0.Jr6LZHMF4i-4aWby7V6GFDKodV11fak-Vzgx-n9Wls0"
}