使用 PUT 请求发送 multipart/form-data 在 Laravel 中不起作用

Sending multipart/form-data with PUT request doesn't work in Laravel

我正在尝试将带有 "Content-Type": "multipart/form-data" 的 HTTP PUT 请求发送到 Laravel 应用程序。当我将方法更改为 POST 时,它起作用了。

$a = $request->all(); // With PUT this is empty but with POST it works fine. 

客户端执行以下代码:

axios({
    method: "post", // when I try method:"PUT" and change the content type 
    url: "/api/offer",
    data: fd,
    headers: {"Content-Type": "multipart/form-data"} // here change to "x-www-form-urlencoded" it the $a array on backend is empty! 
}).then(response => {
    console.log("/offer/" + response.data)
    if (response.data)
        window.location.replace("/offer/" + this.offer.id);
    else {
        console.log("show a message that something went wrong! ")
    }
}).catch(function (error) {
})

我在 docs 中找不到 PUT 无法发送的任何地方“multipart/form-data”

那么,PUT 可以发送“multipart/form-data”吗?或者只有 POST 一般可以这样做,或者这只是一个 PHP / Laravel 问题?

编辑: 另外,除了正确遵守 HTTP 协议和 CRUD 操作之外,使用 PUT 而不是 POST 有什么区别?

Laravel(HTML 表单)不适用于 Put 请求,因此您需要将 POST 请求伪装成 PUT 或 PATCH 请求。在 Axios 上,您使用 .post 动词,但在您的表单数据中,您附加

_method: "put"

来自官方文档的信息: https://laravel.com/docs/8.x/routing#form-method-spoofing


文档摘录:

HTML forms do not support PUT, PATCH, or DELETE actions. So, when defining PUT, PATCH, or DELETE routes that are called from an HTML form, you will need to add a hidden _method field to the form. The value sent with the _method field will be used as the HTTP request method

我 运行 几周前自己在一个 Symfony 5.3 项目中遇到了这个问题。它只适用于 POST 请求,不适用于 PUT。 Here's an issue from the Symfony GitHub that explains it in more detail.

据我了解,问题在于这些请求的 PHP 实施。 HTTP 标准“PUT”支持它,但 PHP 不支持。这里还有一个 link 来自 PHP bugtracker.

的错误