最近做项目的时候,前端异步请求用到了尤大推荐的axios,发现一个问题,就是POST请求的时候,后台人员说他们的接口里面取不到我传过去的数据。
案例重现
axios.js
let axios = import('axios');
instance = axios.create({
baseURL: '/ghcws',
timeout: 10000,
});
export default instance;
userService.js
import axios = import('./axios');
export async function () {
axios.post('/api/doLogin', {
usesrname: 'admin',
password: 'admin'
})
}
后端的springMVC的关键代码(简化版)
@RequestMappting("/api/doLogin")
public Object doLogin(@RequestParam String username, @RequestParam String password) throws Exception {
System.out.println("username: "+username);
System.out.println("password: "+password);
JSONObject json = new JSONObject();
json.put("success", true);
return json;
}
这个时候前端发的请求后端就接收不到参数了。
我们可以打开chrome开发者工具,看看axios的请求的请求头详情,发现Request-Headers的Content-Type是application/json;charset=UTF-8,Request Payload为
{username: "admin", password: "admin"}
我们同样的用jquery的ajax把我们这个请求同样的发送一遍
发现Request-Headers的Content-Type是application/x-www-form-urlencoded;charset=UTF-8,URL encode为
username=admin&password=admin
到这里,由于是前端换了一个发送ajax请求的工具,导致以前的接口不能用了,后端朋友们首先想到的就是我们前端人员写错了,然后我们就要开始苦逼的研究了。
可以看出,两个请求唯一的不同就是Content-Type的问题,朋友们,是Request Headers中的Content-Type哈,不是Response中的哈,不要搞错了。
那不同点找到了,那我们就可以开始搞了,我们大胆的猜想,如果把axios的post请求的Content-Type也变成application/x-www-form-urlencoded,那么问题想必就迎刃而解了。
我们看看axios的源码
axios.create = function create(instanceConfig) {
r