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

Posted

技术标签:

【中文标题】使用 PUT 请求发送 multipart/form-data 在 Laravel 中不起作用【英文标题】:Sending multipart/form-data with PUT request doesn't work in Laravel 【发布时间】:2022-01-13 07:14:40 【问题描述】:

我正在尝试向 Laravel 应用程序发送带有 "Content-Type": "multipart/form-data" 的 HTTP PUT 请求。当我将方法更改为 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 问题?

编辑: 另外,使用 PUT 代替 POST 与正确遵守 HTTP 协议和 CRUD 操作有什么区别?

【问题讨论】:

【参考方案1】:

Laravel(html 表单)不能很好地处理 Put 请求,因此您需要欺骗 POST 请求,就好像它是 PUT 或 PATCH 请求一样。在 Axios 上,您使用 .post 动词,但在您的表单数据中附加

_method: "put"

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


摘自文档:

HTML 表单不支持 PUTPATCHDELETE 操作。因此,在定义从 HTML 表单调用的 PUTPATCHDELETE 路由时,您需要向表单添加隐藏的 _method 字段。使用_method字段发送的值将作为HTTP请求方法

【讨论】:

【参考方案2】:

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

据我了解,问题在于这些请求的 PHP 实现。 HTTP 标准“PUT”支持它,但 PHP 不支持。这里还有来自PHP bugtracker 的错误链接。

【讨论】:

以上是关于使用 PUT 请求发送 multipart/form-data 在 Laravel 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Fetch API 将第一个 PUT 请求作为 OPTIONS 发送

thinkphp3.2 请求怎么发送 put

[尝试发送其他语言的PUT请求时出现服务器错误

如何在 jQuery 中发送 PUT/DELETE 请求?

通过 Qt 发送 PUT 请求时错误的请求类型 PUT,适用于 curl

(转)SpringMvc如何使用form发送PUT和DELETE请求