Axios DELETE 请求正文被发送为空

Posted

技术标签:

【中文标题】Axios DELETE 请求正文被发送为空【英文标题】:Axios DELETE request body being sent empty 【发布时间】:2019-10-16 20:27:41 【问题描述】:

我正在尝试向我的 php/Codeigniter api 发送删除请求。从 NativeScript-Vue 前端发送。

 async deleteBackedupImages(identifiers) 
        console.log(identifiers);
        try             
            var  data  = await axios(
                url: this.apiUrl + "/images?XDEBUG_SESSION_START=dsadsad",
                method: "delete",
                data:
                    identifiers
                ,
                headers:  "X-Requested-With": "XMLHttpRequest","Content-Type": "application/json" 
            );
            return data;
         catch (error) 
            throw error;
        
    

在 PHP 方面,我有这个函数来处理 JSON 数据:

function getJSONData():stdClass
    try 
        $ci =& get_instance();
        $stream_clean = $ci->security->xss_clean($ci->input->raw_input_stream);
        $request = json_decode($stream_clean);
        return $request;
     catch (\Throwable $th)     
       throw $th;
    


“标识符”只是一个字符串数组。

$stream_clean 变量显示为空字符串,而不是 JSON 字符串。

我不得不说这有点奇怪,Axios 文档声明如下:

//data是要作为请求体发送的数据 //仅 适用于请求方法“PUT”、“POST”和“PATCH”

我在各种帖子中看到,数据对象可以实际上是通过删除请求发送的。

我的代码可能有什么问题?

【问题讨论】:

“我在各种帖子中看到,数据对象实际上可以通过删除请求发送。” - 专门指 Axios,或者仅仅是删除请求能有身体还是不能一般?您从文档中引用的内容可能只是表明 Axios 在指定 method: "delete" 时不会发送正文,无论您是否提供 data ...... 你知道你的代码有什么问题:你试图发送一个带有一个没有定义语义的正文的 DELETE 请求。即使 Axios 发送它,许多服务器实现也会忽略它。 帖子声称可以使用正文发送 Axios 删除请求。喜欢这个:***.com/questions/51069552/… 还有这个:github.com/axios/axios/issues/897 那么也许服务器端部分不关心 DELETE 请求的主体。这是 CodeIgniter 吗?您是否研究过它是否以您想要的方式处理 DELETE 请求的主体? 04fs,我想过这个,但有趣的是,当使用 Postman 发送时,它可以 100% 工作:D 当然,“邮递员做了一些不同的事情”,但我不知道是什么。 【参考方案1】:

使用 params 代替 body 通过 Axios 发送 DELETE 请求:

var  data  = await axios(
   url: this.apiUrl + "/images?XDEBUG_SESSION_START=dsadsad",
   method: "delete",
   params:
      identifiers
   ,
   headers:  "X-Requested-With": "XMLHttpRequest","Content-Type": "application/json" 
);

注意根据Axios Documentation

// `params` are the URL parameters to be sent with the request
// Must be a plain object or a URLSearchParams object

【讨论】:

【参考方案2】:

对于那里的 php 人。 PHP 在执行删除/放置时不解析请求正文,因此 $_POST 数据保持为空。您可以使用

获取输入
file_get_contents('php://input'); 

感谢get a PHP delete variable

花了整整一个下午试图弄清楚这一点。在大多数情况下,使用 axios 的 params 选项可能更容易。更多细节在这里:HTTP protocol's PUT and DELETE and their usage in PHP

【讨论】:

以上是关于Axios DELETE 请求正文被发送为空的主要内容,如果未能解决你的问题,请参考以下文章

axios请求中未发送正文数据

是否可以在 Axios 中发送带有 JSON 正文的 get 请求?

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

在 AXIOS 中为 GET 方法发送请求正文会引发错误

使用 Axios 从 React 向 Django 发送数据 - 发布请求为空

在 ReactJs 中使用 axios 发送 POST 请求时 $_FILES 为空