springcloud发布resful,前端用axios请求后台,发现后台的参数获取都是null。开始以为是哪里写错了,折腾了很久。后来上网搜到了解决方案,根源在于前端用axios发送请求时Content-Type默认是
application/json;charset=UTF-8。而后台用的Content-Type是'Content-Type': 'application/x-www-form-urlencoded'。两者不一致导致。
下面是axios的post请求常见的数据格式(content-type)
- Content-Type: application/json : 请求体中的数据会以json字符串的形式发送到后端
- Content-Type: application/x-www-form-urlencoded:请求体中的数据会以普通表单形式(键值对)发送到后端
- Content-Type: multipart/form-data: 它会将请求体的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件
知道原因后,所以有几种解决方案:
一种是修改axios的内容类型,如下:
全局方式:axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
请求时指定方式:
axios({ headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, method: 'post', url: '/api/lockServer/search', data: {xxx: 'xxx'} })
另一种是后台使用Map<String,Object> params参数来接收:
GET请求时可以用@RequestParam Map<String,Object> params,也可以用@RequestBody Map<String, Object> params;POST请求只能用@RequestBody Map<String, Object> params。