在使用laravel开发restful api的时候,我们知道,不同的操作用不同的请求方法,这就需要知道get、post、put、patch、delete等方法获取数据的方式是怎样的
在Controller中
public function index(Request $request)
{
$size = $request->size;
}
获取全部form表单信息:
$request->input()
获取某一个:
$request->input('username')
我们知道,put和patch都是在update操作的时候使用,不同的是,put需要提交全部信息,而patch只需要提交需要修改的信息即可。原以为跟post获取方式是一样的,后来发现自己太天真了,为什么会不一样呢?
Illuminate\Http\Request
中createFromGlobals
方法是这样定义的:
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-Type
为 application/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 获取原始内容解析(这个问题较多,新手不建议),最后就是改提交内容类型。
先看一个例子
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);
}
viencoding.com版权所有,允许转载,但转载请注明出处和原文链接: https://viencoding.com/article/117