首页 文章

PATCH 和 PUT 请求不与 form-data 一起使用

提问于
浏览
4

我正在使用 Laravel 创建 RESTFUL 应用程序,并使用 Postman 测试应用程序。目前,如果 Postman 使用 form-data 发送的数据存在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');
  • 使用 form-data,$request->all()可以用于POST

  • 使用 x-www-form-urlencoded,$request->all()可以用于PATCHPUTPOST

  • 但是,如果我从 Postman 发送带 form-data 的PUTPATCH,则$request->all()将为空(参数不会发送到后端)。

现在解决方案是使用POST来更新模型。我想知道为什么PATCHPUT在从 Postman 发送 form-data 时不起作用。

3 回答

  • 9

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

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

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

    根据文件

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

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

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

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

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

    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 中的文件时,我总是这样做。

    希望这有帮助!

  • 0

    表单媒体类型没有为 PATCH 定义的任何语义,因此使用它们确实是一个坏主意(请参阅https://www.rfc-editor.org/errata/eid3169)。

    对于 PUT,预期的行为是仅存储 form-encoded 有效载荷(以该格式)。这真的是你想要的吗?

相关问题