一、问题描述
-
公司后端小伙伴写了这样一个接口:请求类型为application/json的get接口,然后我按照平时调接口的方式调接口,发现报500了

-
在doc.html中试了一下,也发现报500

-
但后端小伙伴使用postman请求竟然是好的

-
后来发现他将参数放在了body中,于是我将前端get请求参数也放在body中,继续调接口发现我传在data里面的参数在浏览器中丢失了
getToBody(path: string, params?: IObject, headers?: IObject): Promise<IHttpResponse> {
return new Promise((resolve, reject) => {
http({
url: path,
data: params,
headers,
method: "GET"
})
.then(resolve)
.catch((error) => {
if (error !== "-999") {
reject(error);
}
});
});
},
二、查找原因
后端接口报错了,报错主要原因是org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing(缺少必须的请求正文),于是在网上找了找这个问题的原因,发现是后端在controller加了@RequestBody这个注解,所以请求参数必须要放在body中,可是我使用doc.html时,他会将get的参数自动放到path上,后来查找原因才发现
(在浏览器环境下是基于xhr通信的axios),xhr的请求方式如果是GET或者HEAD,会忽略body,将其设置为null,所以在浏览器环境下不能在GET请求的body中传参。而postman是基于fetch通信的,所以它的get请求是可以在body中传参的

三、解决方式
让后端将请求类型改为application/x-www-form-urlencoded
文章描述了一个前端在尝试调用一个需要RequestBody的GET接口时遇到的问题。由于浏览器的限制,GET请求的body在xhr中会被忽略,导致参数丢失并返回500错误。Postman因使用fetch通信,可以处理这种情况。解决方案是将接口修改为接受application/x-www-form-urlencoded类型的参数。

1639

被折叠的 条评论
为什么被折叠?



