php 如何获取PUT方法传递的数据

dwthyt8l  于 2023-09-29  发布在  PHP
关注(0)|答案(8)|浏览(206)

我正在为Laravel创建API。我使用PUT方法来更新数据。
我用Postman使用PUT方法发送数据。在我的控制器中,我得到了一个空数组。如何访问传递的数据?
在我的路线中,我有:

Route::put('vehicletypes/{id}','API\VehicletypeController@update');

在我的控制器中:

public function update(Request $request, $id){

print_r($request->all()); exit;

}

如何获取PUT方法传入的数据?

wz3gfoph

wz3gfoph1#

你得到的是空响应,因为PHP对PUT有一些安全限制。但是Laravel对此有一个解决方案。
因此,要解决这个问题,您必须从Postman发送POST请求,其中POST参数为_method,值为PUT。这应该行得通。

13z8s7eq

13z8s7eq2#

Laravel作弊是因为html表单只支持GET和POST,但它确实理解真实的的PUT/PATCH请求。
这个问题看起来像是在Symfony中,如果它是multipart/form-data,它就不能解析数据,因为一个替代的尝试使用x-www-form-urlencoded内容处理

b4wnujal

b4wnujal3#

public function putUpdate(Request $request, $id){

print_r($request->all()); exit;

}

也要改变路线,

Route::put('vehicletypes/{id}','API\VehicletypeController@putUpdate');
vd2z7a6w

vd2z7a6w4#

在Postman的body标签下选中“x-www-form-urlencoded”而不是“form-data”,put方法也可以工作...

mqkwyuun

mqkwyuun5#

为什么没有人给出明确的解释最初的放法场

{{method_field('put')}}

因为您的路由器uri是使用命令显示的

php artisan router:list

的更新方法是put/patch,因此首先添加

{{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>
a5g8bdjr

a5g8bdjr6#

以下链接将解决获取请求表数据和图像的问题。
如果你使用的是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方法沿着表单参数

q1qsirdb

q1qsirdb7#

如前所述,这不是laravel(或symfony,或任何其他框架)的问题,这是PHP的限制。
所以,我找到了this PECL extension。我对pecl不是很熟悉,而且似乎不能用pear来让它工作。但我用的是CentOS和Remi PHP,它有一个yum包。
我相信还有其他各种风格的Linux软件包,我相信任何对pear/pecl/general php扩展有更多了解的人都可以毫无问题地在windows或mac上运行它。
我运行了yum install php-pecl-apfd,它立即修复了这个问题(我不得不重新启动我的docker容器,但这是一个给定的)。
也就是说,request->all()files->get()使用multipart/form-data重新开始处理PATCH和PUT请求。
因此,我设法让我的API与我的前端很好地配合,而没有添加任何怪癖(这需要传达给任何开发前端解决方案的人)或打破RESTful约定。

ivqmmu1c

ivqmmu1c8#

由于Laravel无法解析PUT数据,因此您可以直接使用流来检索数据:

$input = file_get_contents('php://input');
parse_str($input, $data); // Parsing form
print_r($data); // Your data

来源:https://www.php.net/manual/en/wrappers.php.php#wrappers.php.input

相关问题