php - 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');
- 使用表单数据,
$request->all()
对于POST
. - 使用 x-www-form-urlencoded,
$request->all()
可以用于PATCH
,PUT
和POST
. - 但是,如果我从 Postman发送
PUT
并使用表单数据,则将为空(参数不会发送到后端)。PATCH
$request->all()
现在的解决方案是POST
用于更新模型。我想知道从 Postman 发送表单数据时为什么PATCH
并且PUT
不工作。
解决方案
这是一个已知问题,根据以下 Github评论的解决方法建议是,在发送PATCH
/PUT
请求时,您应该执行以下操作:
您应该发送 POST 并将 _method 设置为 PUT(与发送表单相同)以使您的文件可见
所以本质上你发送一个带有参数的 POST 请求来设置实际的方法,Laravel 似乎明白这一点。
根据文档:
由于 HTML 表单不能发出
PUT
、、PATCH
或DELETE
请求,因此您需要添加一个隐藏_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>
推荐阅读
- python - 来自 Keras 的关于 LSTM 网络的简单问题
- python - 有什么办法可以限制 Telebot 中的用户回复时间?
- git - 如何忽略 .gitignore 中的确切文件名?(没有子字符串)
- python-3.x - Selenium 找不到第九个元素 - python
- javascript - 如何使用 minibarjs 自定义滚动条纯 javascript?
- c# - Xamarin.Forms IOS 通信串行/USB 通过电缆与 iphone?
- wordpress - Woocommerce REST API 排除订单端点中的特定产品订单
- python - 使用 Python3 在 Jupyter 中没有名为“请求”的模块,但 Python3 的“要求已经满足”
- html - 如何根据右侧的可滚动内容文本滚动图像?
- c++ - 为什么usleep会影响后面的代码性能?