使用 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 表单不支持
PUT
、PATCH
或DELETE
操作。因此,在定义从 HTML 表单调用的PUT
、PATCH
或DELETE
路由时,您需要向表单添加隐藏的_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 发送