PATCH 和 PUT 请求不能处理表单数据

2022-08-30 09:13:26

我正在使用Laravel创建一个RESTFUL应用程序,并使用Postman测试该应用程序。目前,Postman发送的数据与表单数据存在问题。PATCHPUT

// 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');
  • 使用表单数据,对于 .$request->all()POST
  • 使用 x-www-form-urlencoded, 将适用于 、 和 。$request->all()PATCHPUTPOST
  • 但是,如果我从Postman发送并使用表单数据,则将为空(参数不会发送到后端)。PUTPATCH$request->all()

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


答案 1

这是一个已知问题,根据以下 Github 注释,解决方法建议是,在发送 / 请求时,应执行以下操作:PATCHPUT

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

因此,从本质上讲,您发送了一个带有参数的POST请求,该参数设置了实际方法,Laravel似乎理解这一点。

根据文档

由于 HTML 表单无法发出 、 或 请求,因此您需要添加一个隐藏字段来欺骗这些 HTTP 谓词。Blade 指令可以为您创建此字段:PUTPATCHDELETE_method@method

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

    ...
</form> 

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

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

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

答案 2

我在这篇文章中学会了如何解决它,我想分享我做了什么。

下图是我设置Postman发送HTTP POST请求并进入PUT请求并使其接收我的文件的方式。

我不确定这是否是做RESTFul API的正确方法。但它工作正常

An example on Postman how to setup your HTTP Request


推荐