Yii2学习笔记系列22——Requests(请求处理之请求)

二 07 六月 2016

请求

对于一个应用程序来说,请求代表yii\web\Request对象,它可以提供诸如请求参数、HTTP请求头、cookies等信息。对于一个给定的request,你可以通过request应用组件(默认情况下是yii\web\Request的实例)来访问相应的请求对象。在本章节中,我们主要讲解如何在你的应用程序中使用该组件。

请求参数

为了得到请求的参数,你可以通过调用request组件的get()post()方法,他们会分别返回$_GET$_POST的值。例如:

$request = Yii::$app->request;

$geet = $request->get();
// 等价于:$get = $_GET;

$id = $request->get('id');
// 等价于:$id = isset($_GET['id']) ? $_GET['id'] : null;

$id = $request->get('id', 1);
// 等价于:$id = isset($_GET['id']) ? $_GET['id'] : 1;

$post = $request->post();
// 等价于:$post = $_POST;

$name = $request->post('name');
// 等价于:$name = isset($_POST['name']) ? $_POST['name'] : null;

$name = $request->post('name', '');
// 等价于:$name = isset($_POST['name']) ? $_POST['name'] : '';

信息:除了可以直接通过$_GET$_POST来获取请求的参数,更多的还是建议你像上面展示的那样儿通过request组件来获取请求参数。这会使得编写测试变得非常容易,因为你可以用假的测试请求数据创建一个模拟请求组件。

当实现RESTful API时,你可能经常需要获取通过PUT、PATCH或者其他请求方法提交的参数。你可以通过调用yii\web\Request::getBodyParam()方法来获取这些参数。例如:

$request = Yii::$app->request;

// 返回所有的参数
$params = $request->bodyParams;

// 返回名为"id"的参数
$param = $request->getBodyParam('id');

信息:不同于通过GET提交的参数,通过POSTPUTPATCH等方法提交的参数,是被发送到request body(即请求体)中的。当你通过上述方法访问这些参数时,request组件会解析这些参数。你可以通过配置yii\web\Request::parsers属性来自定义解析这些参数的方式。

请求方法

你可以通过表达式Yii::$app->request->method获取当前的请求所使用的HTTP方法,同时还会提供一系列的布尔类型属性用于检查当前方法是否适用于某些特定类型。例如:

$request = Yii::$app->request;

if ($request->isAjax) { /*请求是AJAX请求*/ }
if ($request->isGet) { /*请求方法是GET*/ }
if ($request->isPost) { /*请求方法是POST*/ }
if ($request->isPut) { /*请求方法是PUT*/ }

请求URL

request组件提供了许多检查当前请求的URL的方法。

假设请求的URL是http://example.com/admin/index.php/product?id=100,你可以像如下总结的一样获取URL的各个部分:

  • url:返回/admin/index.php/product?id=100,这是不包含host信息部分的URL
  • absoluteUrl:返回http://example.com/admin/index.php/product?id=100,这是整个的URL,包括host信息部分
  • hostInfo:返回http://example.com,这是URL的host信息部分
  • pathInfo:返回/product,这是在入口脚本之后、查询标记(即URL中的?号)之前的部分
  • queryString:返回id=100,这是在查询标记之后的部分
  • baseUrl:返回/admin,这是在host信息之后、入口脚本之前的那部分
  • scriptUrl:返回/admin/index.php,这是不包含路径信息和查询字符串的那部分URL
  • serverName:返回example.com,这是URL中的host名
  • serverPort:返回80,这是Web server使用的端口号

HTTP请求头

你可以从yii\web\Request::headeres属性返回的header collection - 请求头集合中提取HTTP请求头信息。例如:

// $headers是yii\web\HeaderCollection的一个对象
$headers = Yii::$app->request0>headers;

// 返回接受的header值
$accept = $headers->get('Accept');

if ($headers->has('User-Agent')) { /*可以获取到User-Agent头*/ }

request组件也提供了快速访问一些常用的头文件的支持,例如:

  • userAgent:返回User-Agent的值
  • contentType:返回Content-Type,用于指示请求体中数据的MIME类型
  • acceptableContentTypes:返回用户可接受的语言,顺序根据用户的偏好设置顺序而定,第一个元素代表了最喜欢的语言

如果你的应用支持多种语言,并且你想要以终端用户最喜欢的语言展示页面,你可以使用语言协商方法yii\web\Request::getPreferredLanguage(),该方法获取你的应用支持的语言列表,将其与acceptableLanguages做对比,返回最适合的语言。

提示:你也可以使用ContentNegotiator过滤器来动态判断应该在响应中使用哪种内容类型和语言。过滤器实现了上述属性和方法的内容协商。

客户端信息

你可以分别通过usereHostuserIP方法获取客户端机器的host名和IP地址。例如:

$userHost = Yii:$app->request->userHost;
$userIP = Yii:$app->request->userIP;

Category: PHP Develop

Comments