我正在使用 Laravel 创建 RESTFUL 应用程序,并使用 Postman 测试应用程序。目前,如果 Postman 使用 form-data 发送的数据存在PATCH
或PUT
的问题。
// Parameter `{testimonial}` will be sent to backend.
Route::post ('testimonials/{testimonial}', 'TestimonialController@update');
// Parameter `{testimonial}` will not be sent to backend (`$request->all()` will be empty) if sent from Postman with form-data.
Route::patch ('testimonials/{testimonial}', 'TestimonialController@update');
Route::put ('testimonials/{testimonial}', 'TestimonialController@update');
-
使用 form-data,
$request->all()
可以用于POST
。 -
使用 x-www-form-urlencoded,
$request->all()
可以用于PATCH
,PUT
和POST
。 -
但是,如果我从 Postman 发送带 form-data 的
PUT
和PATCH
,则$request->all()
将为空(参数不会发送到后端)。
现在解决方案是使用POST
来更新模型。我想知道为什么PATCH
和PUT
在从 Postman 发送 form-data 时不起作用。
3 回答
这是一个已知问题,根据以下 Github 评论的解决方案建议是,当发送
PATCH
/PUT
请求时,您应该执行以下操作:所以基本上你发送一个带有参数的 POST 请求,该参数设置实际的方法,Laravel 似乎明白这一点。
根据文件:
或者,您可以使用method_field帮助函数执行上述操作:
Laravel PATCH 和 PUT 方法不适用于
form-data
,它是已知的 Symfony 甚至 PHP 的问题(谷歌为此--Laravel 使用许多 Symfony 基础包,包括 Request)。如果您不需要通过请求传递 file(s),请使用 json content-type 将
form-data
更改为raw
。 E.g:{"name":"changed"}
。它将被读作php://input
并且您的代码应该运行良好($request->all()
现在是["name" => "changed]
)。如果你需要传递 file(s),在我看来,不要在 REST API 方法中传递它。您可以编写另一种方法来执行)所需的任何操作(E.g:
POST form-data
- >上传文件 - >更新数据库 - >返回文件 path/url/even 其 base64 内容),然后您可以使用其 output/result 继续您的 patch/put 方法(raw
与 json content-type)。当我使用 API 中的文件时,我总是这样做。希望这有帮助!
表单媒体类型没有为 PATCH 定义的任何语义,因此使用它们确实是一个坏主意(请参阅https://www.rfc-editor.org/errata/eid3169)。
对于 PUT,预期的行为是仅存储 form-encoded 有效载荷(以该格式)。这真的是你想要的吗?