在 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 方法发送请求正文会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 axios get 请求发送正文数据和标头?

axios请求中未发送正文数据

为啥 axios get 方法请求发送两次?

Azure APIM 在预检和从 axios 发出的 GET 请求时返回空响应正文,状态代码为 200

尝试在 Axios GET 的正文中发送数据以在 Django 后端使用,但 request.body 的打印为空

Axios DELETE 请求正文被发送为空