在 AXIOS 中为 GET 方法发送请求正文会引发错误
Posted
技术标签:
【中文标题】在 AXIOS 中为 GET 方法发送请求正文会引发错误【英文标题】:Sending Request body for GET method in AXIOS throws error 【发布时间】:2019-05-29 01:16:00 【问题描述】:我有一个 React 应用程序,我正在将 POST 方法更改为 GET 请求正文。它适用于 POST 请求,但是当我将方法更改为 GET 时,它给了我错误-
message: "org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public
我的前端代码-
export const setData = (getData) => dispatch =>
axios(
method: 'GET',
url: 'http://localhost:8080/api',
headers:
'Content-Type': 'application/json'
,
data: getData
)
.then (response =>
dispatch(
type: API_DATA,
payload: response.data
)
dispatch(
type: SET_SEARCH_LOADER,
payload: false
)
)
.catch(function(error)
)
谁能让我知道我在这里缺少什么。据我了解,http 允许拥有 GET 方法的请求正文。
【问题讨论】:
浏览器上的 Axios GET 请求使用不支持请求正文的 XMLHttpRequest,因此您面临此问题。查看 github 上的this issue 了解更多详情 【参考方案1】:据我了解,http 允许拥有 GET 方法的请求正文。
虽然这在技术上是正确的(虽然说它只是没有明确禁止它可能更准确),但这是一件非常奇怪的事情,并且大多数系统不希望 GET 请求具有正文。
因此,很多图书馆都无法处理这个问题。
documentation for Axois 说:
// `data` is the data to be sent as the request body // Only applicable for request methods 'PUT', 'POST', and 'PATCH'
实际上,如果您在 Web 浏览器中运行 Axios 客户端,它将使用 XMLHttpRequest。如果您查看the specification for that,它会说:
client . send([body = null])
发起请求。 body 参数提供请求正文(如果有),如果请求方法为 GET 或 HEAD,则被忽略。
【讨论】:
我的 getData 是一个空对象,我正在尝试发送。这行不通吗? @techiequestie — 不,不会。浏览器将忽略您尝试设置为请求正文的任何内容,并在没有任何内容的情况下发送 GET 请求。 那我该怎么处理呢?我需要在请求中添加任何参数吗? 请求应该是 POST 请求,或者服务器应该不期待 GET 请求的请求正文。我不知道请求的要求是什么,所以我不能说哪种方法是正确的。 我有另一个 api 来自后端,他们已将数据作为参数附加到 api 中,所以它可以工作。但是对于这个 api,它不存在,我试图弄清楚这是否是后端必须具备的,或者有什么方法可以通过 UI 处理。【参考方案2】:如果你想在axios中用get请求发送参数,你应该发送参数为params
。
如果您想设置"Content-type":"application/json"
并使用get 请求发送参数,您还应该发送一个空的data
对象。
例如:
const AUTH_TOKEN = 'Bearer token'
const config =
headers:
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': AUTH_TOKEN,
,
data: ,
params:
"post_id": 1
axios.get("http://localhost/api/v1/posts/", config)
【讨论】:
【参考方案3】:这不是 axios,错误来自您正在与之交谈的 java 后端。您的请求正文中的公共字段丢失。
如果您只想将数据作为参数发送(这很奇怪),请使用params
而不是data
传递它(如下所示:https://github.com/axios/axios#example)。
我个人认为您的 API 不应该支持带有请求正文的 GET(与开发人员交谈并索要文档)。
【讨论】:
OP 询问为什么缺少请求正文(是 Axios) 我没明白。我在这里错过了什么吗? @Quentin 是的,你是对的,我问错了问题。我修改了答案。以上是关于在 AXIOS 中为 GET 方法发送请求正文会引发错误的主要内容,如果未能解决你的问题,请参考以下文章
Azure APIM 在预检和从 axios 发出的 GET 请求时返回空响应正文,状态代码为 200