【问题标题】:Axios Delete request with body and headers?带有正文和标头的 Axios 删除请求?
【发布时间】:2018-12-06 17:58:43
【问题描述】:

我在 ReactJS 中编程时使用 Axios,我假装向我的服务器发送 DELETE 请求。

为此,我需要标题:

headers: {
  'Authorization': ...
}

身体是由

组成的
var payload = {
    "username": ..
}

我一直在互联网上搜索,只发现DELETE方法需要一个“参数”并且不接受任何“数据”。

我一直在尝试这样发送:

axios.delete(URL, payload, header);

甚至

axios.delete(URL, {params: payload}, header);

但似乎没有任何效果......

有人能告诉我是否可以(我想是的)发送一个包含标题和正文的 DELETE 请求以及如何发送?

提前谢谢你!

【问题讨论】:

    标签: javascript reactjs http axios http-delete


    【解决方案1】:

    所以经过多次尝试,我发现它工作正常。

    请按照顺序进行这很重要,否则将不起作用

    axios.delete(URL, {
      headers: {
        Authorization: authorizationToken
      },
      data: {
        source: source
      }
    });
    

    【讨论】:

    • 您好,您能解释一下为什么您的答案有效吗?
    • 可能是因为DELETE 不应该有请求正文。也许那里有什么东西可以防止这种情况发生(因为它应该)
    • @Evert 不正确,DELETE 请求的主体未定义语义,因此您可以拥有请求主体,但旧的实现可能会拒绝该请求。 IMO,您应该拥有请求正文,并淘汰旧客户并轮换新客户。
    • @VictorPudeyev 嘿,我知道 HTTP 规范中的语言令人困惑。是的,主体可能出现,但它对服务器应该有任何意义。因此,向 HTTP DELETE 正文添加正文从来都不是很好的理由。所以你可以添加一个body,但是没有意义。
    • 所以我原来的评论是正确的。事实上,即将到来的 HTTP 规范中有一段与此相呼应:“客户端不应该在 DELETE 请求中生成内容。在 DELETE 请求中接收的内容没有定义的语义,不能改变请求的含义或目标,并且可能导致一些实现拒绝请求。”
    【解决方案2】:

    axios.delete 确实支持请求正文。它接受两个参数:url 和可选配置。您可以使用config.data 设置请求正文和标头,如下所示:

    axios.delete(url, { data: { foo: "bar" }, headers: { "Authorization": "***" } });
    

    请看这里 - https://github.com/axios/axios/issues/897

    【讨论】:

    • 问题是我想在同一个删除请求中发送正文和标头
    【解决方案3】:

    这里简要总结一下用 axios 发送各种 http 动词所需的格式:

    • GET: 两种方式

      • 第一种方法

        axios.get('/user?ID=12345')
          .then(function (response) {
            // Do something
          })
        
      • 第二种方法

        axios.get('/user', {
            params: {
              ID: 12345
            }
          })
          .then(function (response) {
            // Do something
          })
        

      以上两个是等价的。观察第二种方法中的params关键字。

    • POSTPATCH

      axios.post('any-url', payload).then(
        // payload is the body of the request
        // Do something
      )
      
      axios.patch('any-url', payload).then(
        // payload is the body of the request
        // Do something
      )
      
    • DELETE

      axios.delete('url', { data: payload }).then(
        // Observe the data keyword this time. Very important
        // payload is the request body
        // Do something
      )
      

    关键要点

    • get 请求可选地需要一个 params 键来正确设置查询参数
    • delete 带有正文的请求需要在 data 键下设置

    【讨论】:

    • 你的回答让我希望在堆栈溢出时有 +2 投票功能。
    • 这是唯一详细解释它的答案。谢谢它真的有助于理解其他人。
    • 如何发送带参数的删除请求,而不是正文?
    • 这个问题的最佳答案。谢谢。
    • @MaFiA,如果你想发送带参数的删除请求。您可以使用查询字符串将其简单地放在 url 中
    【解决方案4】:

    axios。删除passed a url and an optional configuration

    axios.delete(url[, config])

    字段available to the configuration can include the headers

    这使得 API 调用可以写成:

    const headers = {
      'Authorization': 'Bearer paperboy'
    }
    const data = {
      foo: 'bar'
    }
    
    axios.delete('https://foo.svc/resource', {headers, data})
    

    【讨论】:

    • 这对我不起作用...我有 const headers = {'Authorization': ...}data = {'username': ...}axios.delete('http://...', {headers, data}) 结尾,但服务器无法访问标题...
    • 从浏览器发出的请求说的不一样。请参阅此 Stackblitz (stackblitz.com/edit/react-gq1maa) 以及浏览器网络选项卡中的请求 (snag.gy/JrAMjD.jpg)。您需要确保在此处以正确的方式读取标头服务器端,或者请求没有被拦截和篡改。
    • 为我工作,我正在使用 React 和 Django
    【解决方案5】:

    对于删除,您需要按照以下步骤进行操作

    axios.delete("/<your endpoint>", { data:<"payload object">})
    

    它对我有用。

    【讨论】:

      【解决方案6】:

      我遇到了同样的问题,我就是这样解决的:

      axios.delete(url, {data:{username:"user", password:"pass"}, headers:{Authorization: "token"}})
      

      【讨论】:

        【解决方案7】:

        实际上,axios.delete 支持请求正文。
        它接受两个参数:URL 和可选的config。那就是……

        axios.delete(url: string, config?: AxiosRequestConfig | undefined)
        

        您可以执行以下操作来设置删除请求的响应正文:

        let config = { 
            headers: {
                Authorization: authToken
            },
            data: { //! Take note of the `data` keyword. This is the request body.
                key: value,
                ... //! more `key: value` pairs as desired.
            } 
        }
        
        axios.delete(url, config)
        

        我希望这对某人有帮助!

        【讨论】:

        • 谢谢,我在我的nestJs HttpService 删除方法中使用这个:this.httpService.delete(apiUrl, { headers: headersRequest, data: deleteBody })
        【解决方案8】:

        对于那些尝试了上述所有方法但仍然看不到请求的有效负载的人 - 确保您有:

        "axios": "^0.21.1" (not 0.20.0)
        

        那么,上面的解决方案就起作用了

        axios.delete("URL", {
              headers: {
                Authorization: `Bearer ${token}`,
              },
              data: {
                var1: "var1",
                var2: "var2"
              },
            })
        

        您可以使用

        访问有效负载
        req.body.var1, req.body.var2
        

        问题来了:

        https://github.com/axios/axios/issues/3335

        【讨论】:

          【解决方案9】:

          如果我们有:

          myData = { field1: val1, field2: val2 }
          

          我们可以将数据 (JSON) 转换为字符串,然后将其作为参数发送到后端:

          axios.delete("http://localhost:[YOUR PORT]/api/delete/" + JSON.stringify(myData), 
               { headers: { 'authorization': localStorage.getItem('token') } }
           )
          

          在服务器端,我们取回我们的对象:

          app.delete("/api/delete/:dataFromFrontEnd", requireAuth, (req, res) => {
              // we could get our object back:
              const myData = JSON.parse(req.params.dataFromFrontEnd)
           })
          

          注意:2 月 14 日 15:49x4wiz”的答案比我的更准确!我的解决方案是没有“身体”(在某些情况下可能会有所帮助......)

          更新:当对象的重量为 540 字节 (15*UUIDv4) 或更多时,我的解决方案不起作用(请查看文档以获取确切值)。 “x4wiz”(以及上面的许多其他)的解决方案要好得多。那么,为什么不删除我的答案呢?因为,它有效,但大多数情况下,它为我带来了 Stackoverflow 的大部分声誉;-)

          【讨论】:

            【解决方案10】:

            要通过 axios 发送带有一些标头的 HTTP DELETE,我已经这样做了:

              const deleteUrl = "http//foo.bar.baz";
              const httpReqHeaders = {
                'Authorization': token,
                'Content-Type': 'application/json'
              };
              // check the structure here: https://github.com/axios/axios#request-config
              const axiosConfigObject = {headers: httpReqHeaders}; 
            
              axios.delete(deleteUrl, axiosConfigObject);
            

            axios 用于不同 HTTP 动词(GET、POST、PUT、DELETE)的语法很棘手,因为有时第二个参数应该是 HTTP 正文,而其他时候(可能不需要它)你只需传递标题作为第二个参数。

            但是,假设您需要发送一个没有 HTTP 正文的 HTTP POST 请求,那么您需要传递 undefined 作为第二个参数。

            请记住,根据配置对象 (https://github.com/axios/axios#request-config) 的定义,当调用 axios.delete 时,您仍然可以通过 data 字段在 HTTP 调用中传递 HTTP 正文,但是对于 HTTP DELETE 动词它将被忽略。

            第二个参数有时是 HTTP 正文,有时是 axios 的整个 config 对象之间的混淆是由于 HTTP 规则的实施方式造成的。有时,HTTP 调用不需要 HTTP 主体即可被视为有效。

            【讨论】:

              【解决方案11】:

              我找到了一种可行的方法:

              axios
                    .delete(URL, {
                      params: { id: 'IDDataBase'},
                      headers: {
                        token: 'TOKEN',
                      },
                    }) 
                    .then(function (response) {
                      
                    })
                    .catch(function (error) {
                      console.log(error);
                    });
              

              我希望这对你也有用。

              【讨论】:

                【解决方案12】:

                我遇到了同样的问题... 我通过创建自定义 axios 实例解决了这个问题。并使用它来发出经过身份验证的删除请求..

                const token = localStorage.getItem('token');
                const request = axios.create({
                        headers: {
                            Authorization: token
                        }
                    });
                
                await request.delete('<your route>, { data: { <your data> }});
                

                【讨论】:

                  【解决方案13】:

                  我尝试了以上所有对我不起作用的方法。我最终只是使用 PUT(找到灵感here),并更改了我的服务器端逻辑以在此 url 调用上执行删除。 (django rest 框架函数覆盖)。

                  例如

                  .put(`http://127.0.0.1:8006/api/updatetoken/20`, bayst)
                        .then((response) => response.data)
                        .catch((error) => { throw error.response.data; });
                  

                  【讨论】:

                    【解决方案14】:

                    与 axios 无关,但可能会帮助人们解决他们正在寻找的问题。 PHP 在执行删除调用时不解析发布数据。 axios delete 可以通过请求发送正文内容。 示例:

                    //post example
                    let url = 'http://local.test/test/test.php';
                    let formData = new FormData();
                    formData.append('asdf', 'asdf');
                    formData.append('test', 'test');
                    
                    axios({
                        url: url,
                        method: 'post',
                        data: formData,
                    }).then(function (response) {
                        console.log(response);
                    })
                    
                    result: $_POST Array
                    (
                        [asdf] => asdf
                        [test] => test
                    )
                    
                    
                    // delete example
                    axios({
                        url: url,
                        method: 'delete',
                        data: formData,
                    }).then(function (response) {
                        console.log(response);
                    })
                    
                    result: $_POST Array
                    (        
                    )
                    

                    在 php 中获取删除调用的发布数据:

                    file_get_contents('php://input'); 
                    

                    【讨论】:

                      【解决方案15】:
                      axios.post('/myentity/839', {
                        _method: 'DELETE'
                      })
                      .then( response => {
                        //handle success
                      })
                      .catch( error => {
                         //handle failure
                      });
                      

                      感谢: https://www.mikehealy.com.au/deleting-with-axios-and-laravel/

                      【讨论】:

                        猜你喜欢
                        • 2022-01-23
                        • 2021-08-13
                        • 2020-12-23
                        • 2016-02-06
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多