我正在为Laravel创建一个API。我使用PUT方法更新数据。
我使用PUT方法向Postman发送数据。在我的控制器中,我得到一个空数组。如何访问传递的数据?
在我的路线中,我有:
Route::put('vehicletypes/{id}','API\VehicletypeController@update');
在我的控制器中:
public function update(Request $request, $id){
print_r($request->all()); exit;
}
如何以 PUT 方法传递数据?
答案 0 :(得分:4)
您的响应为空,因为PHP对PUT
有一些安全限制。但是Laravel有一个解决方法。
因此,要解决此问题,您必须使用POST
参数POST
发送__method
来自Postman的请求,其值为PUT
。它应该工作。
答案 1 :(得分:2)
Laravel作弊因为html表单只支持GET和POST,但它确实理解真正的PUT / PATCH请求。
问题看起来就像Symfony一样,如果它是multipart / form-data,它无法解析数据,因为使用x-www-form-urlencoded内容处理的替代尝试。
答案 2 :(得分:1)
expect "*(current) UNIX password: "
expect "*Enter new UNIX password: "
expect "*Retype new UNIX password: "
也改变路线,
public function putUpdate(Request $request, $id){
print_r($request->all()); exit;
}
答案 3 :(得分:1)
在邮递员的“正文”选项卡下选中了“ x-www-form-urlencoded”,而不是“ form-data”,放置方法也可以正常工作...
答案 4 :(得分:0)
为什么没人给出明确的解释
的第一个put方法字段{{method_field('put')}}
您的路由器uri是使用命令显示的
php artisan router:list
更新方法被放置/修补,因此首先添加
{{method_field('put')}}
和您表单中的字段应该相同
<form action="{{route('posts.update',$post->id)}}" method="post">
添加csrf_toke表单后将正常工作。最终形状将如下所示。
<form action="{{route('posts.update',$post->id)}}" method="post" >
{{method_field('put')}}
<input type="hidden" name="_token" value="{{csrf_token()}}">
<!-- Name input-->
<div class="form-group">
<label class="col-md-3 control-label" for="name">Title</label>
<div class="col-md-9">
<input id="name" name="title" type="text" value="{{$post->title}}" class="form-control">
</div>
</div>
<!-- Message body -->
<div class="form-group">
<label class="col-md-3 control-label" for="body">
Body</label><br>
<div class="col-md-9">
<textarea class="form-control" id="message" name="body" rows="5">
{{$post->body}}
</textarea>
</div>
</div>
<!-- Form actions -->
<div class="form-group">
<div class="col-md-9 text-right col-md-offset-3">
<button type="submit" class="btn btn-success btn-lg">Update</button>
<a href="{{Route('posts.index')}}" type="button" class="btn btn-primary btn-lg">Cancel</a>
</div>
</div>
</form>
答案 5 :(得分:0)
下面的链接将解决问题,以获取请求表数据和图像。
如果您正在使用Laravel,则可以轻松地在\ Illuminate \ Http \ Request实例
只需从下面的链接获取ParseInputStream类:
Class ParseInputStream.php
在Laravel中可选创建另一个验证规则类,但这不是必需的
class NoteUpdateRequest extends Request {
public function all($keys = null)
{
if(strtolower($this->getMethod())=='put' && preg_match('/multipart\/form-data/', $this->headers->get('Content-Type')) or
preg_match('/multipart\/form-data/', $this->headers->get('content-type')))
{
$result = [];
new ParseInputStream($result);
$result = array_merge($result, $this->route()->parameters());
$this->request->add($result);
}
return parent::all($keys);
}
public function rules()
{
dd($this->all());
return [
'noteId' => 'required|integer|exists:notes,id',
'title' => 'required|string|max:200',
'note' => 'required|string|min:10|max:2000'
];
}
}
我希望它可以使用PUT或PATCH方法以及Form Params来解决您要实现的目标
答案 6 :(得分:0)
如上所述,这不是laravel(或symfony或任何其他框架)问题,它是PHP的局限性。
也就是说,我设法找到了this PECL extension。我对pecl不太熟悉,并且似乎无法使它使用梨。但是我正在使用具有yum软件包的CentOS和Remi PHP。
我相信还有其他各种Linux风格的软件包,我相信任何对pear / pecl / general php扩展有更多了解的人都可以使其在Windows或Mac上正常运行。
我运行了yum install php-pecl-apfd
并从字面上解决了这个问题(我不得不重启我的docker容器,但这是给定的。)
也就是说,request->all()
和files->get()
开始使用multipart/form-data
处理PATCH和PUT请求。
Ergo,我设法使我的api很好地与我的前端一起玩,而没有添加任何古怪的东西(这需要传达给开发前端解决方案的任何人)或破坏RESTful约定。