首页 > 解决方案 > PATCH 和 PUT 请求不适用于表单数据

问题描述

我正在使用 Laravel 创建一个 RESTFUL 应用程序,并使用 Postman 测试该应用程序。目前,邮递员发送的数据是否带有表单数据存在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');

现在的解决方案是POST用于更新模型。我想知道从 Postman 发送表单数据时为什么PATCH并且PUT不工作。

标签: phplaravelhttppostman

解决方案


这是一个已知问题,根据以下 Github评论的解决方法建议是,在发送PATCH/PUT请求时,您应该执行以下操作:

您应该发送 POST 并将 _method 设置为 PUT(与发送表单相同)以使您的文件可见

所以本质上你发送一个带有参数的 POST 请求来设置实际的方法,Laravel 似乎明白这一点。

根据文档

由于 HTML 表单不能发出PUT、、PATCHDELETE请求,因此您需要添加一个隐藏 _method字段来欺骗这些 HTTP 动词。@methodBlade 指令可以为你创建这个字段:

<form action="/foo/bar" method="POST">
    @method('PUT')

    ...
</form> 

或者,您可以使用method_field辅助函数来执行上述操作:

method_field 函数生成一个 HTML 隐藏输入字段,其中包含表单的 HTTP 动词的欺骗值。例如,使用 Blade 语法:

<form method="POST">
    {{ method_field('PUT') }}
</form>

推荐阅读