Laravel PUT、PATCH、POST、GET 获取提交信息

2019-03-11 08:58:56   Laravel
  Laravel  

在使用laravel开发restful api的时候,我们知道,不同的操作用不同的请求方法,这就需要知道get、post、put、patch、delete等方法获取数据的方式是怎样的


GET

在Controller中

public function index(Request $request)
{
    $size = $request->size;
}

POST

获取全部form表单信息:

$request->input()

获取某一个:

$request->input('username')

PUT&PATCH&DELETE

原因

我们知道,put和patch都是在update操作的时候使用,不同的是,put需要提交全部信息,而patch只需要提交需要修改的信息即可。原以为跟post获取方式是一样的,后来发现自己太天真了,为什么会不一样呢? Illuminate\Http\RequestcreateFromGlobals方法是这样定义的:

public static function createFromGlobals()
{
        $request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER);
        if (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
                && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH'))
        ) {
                parse_str($request->getContent(), $data);
                $request->request = new ParameterBag($data);
        }
        return $request;
}

这里面的if语句定义如果Content-Type 不是 application/x-www-form-urlencode ,请求方法为PUT, DELETE, PATCH时,就无法解析。post方法可以正常使用是因为php本身就支持$_POST变量,而PUT, DELETE, PATCH 走的是 php://input

方法

我们针对上面的原因分析,我们提供两种方法

第一种,直接获取输入流:

$request->getContent()

这种一般不推荐用,因为输入流数据比较乱,拿到后还要复杂的处理。

第二种是发送请求时,定义Content-Typeapplication/x-www-form-urlencode ,然后我们可以用post的方式获取了。

$request->input()

问题就在这里,如果你的 Content-Type 不是 application/x-www-form-urlencode ,且请求方法又是 PUT、DELET 或 PATCH,就会无法解析(POST 正常是因为 PHP 原生支持解析为 $_POST 变量,而 PUT 只能走 php://input 输入流获取),如果这里不是这个 Content-Type 就会悲剧。

解决办法有三个,一个是继承 Request 对象或通过其他扩展手段重写或补充这部分(这个是最佳实践),还有就是通过 $request->getContent 获取原始内容解析(这个问题较多,新手不建议),最后就是改提交内容类型。


URL参数获取

先看一个例子

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});

在这个例子中,我们在URL中定义{post}, {comment}两个路径参数,而我们在匿名函数中则按照顺序定义两个参数变量$postId,$commentId,然后我们就直接可以用这两个变量获取参数值了。

当然了,更多情况下我们还是在Controller中写逻辑

路由定义

Route::get('posts/{post}/comments/{comment}','HomeController@index');

HomeController 中获取

public function index($postId, $commentId)
{
  dump($postId);
    dump($commentId);
}
vien.tech版权所有,允许转载,但转载请注明出处和原文链接: https://viencoding.com/article/117
欢迎小伙伴们在下方评论区留言 ~ O(∩_∩)O
文章对我有帮助, 点此请博主吃包辣条 ~ O(∩_∩)O

猜你喜欢


评论

There are no comments yet.
未登录

登录后即可发表评论

登录或注册

亲情非友情链接