Yii 响应
当一个Web应用程序处理请求时,它会生成一个响应对象,其中包含HTTP头,正文和HTTP状态码。在大多数情况下,您将使用响应应用程序组件。默认情况下,它是 yii\web\Response 的一个实例。
要管理响应的HTTP状态码,使用 yii\web\Response::$statusCode 属性。默认值为 yii\web\Response::$statusCode 是200。
步骤1 - 在 SiteController 中添加一个名为 actionTestResponse 的函数。
public function actionTestResponse() {
Yii::$app→response->statusCode = 201;
}
步骤2 − 如果你的网络浏览器指向 http://localhost:8080/index.php?r=site/testresponse ,你将会注意到 201 Created 响应状态。
如果你想要表明请求失败,你可以抛出预定义的HTTP异常 –
- yii\web\BadRequestHttpException - 状态码 400。
-
yii\web\UnauthorizedHttpException - 状态码 401。
-
yii\web\ForbiddenHttpException - 状态码 403。
-
yii\web\NotFoundHttpException - 状态码 404。
-
yii\web\MethodNotAllowedHttpException - 状态码 405。
-
yii\web\NotAcceptableHttpException - 状态码 406。
-
yii\web\ConflictHttpException - 状态码 409。
-
yii\web\GoneHttpException - 状态码 410。
-
yii\web\UnsupportedMediaTypeHttpException - 状态码 415。
-
yii\web\TooManyRequestsHttpException - 状态码 429。
-
yii\web\ServerErrorHttpException - 状态码 500。
步骤3 - 修改 actionTestResponse 函数如下所示。
public function actionTestResponse() {
throw new \yii\web\GoneHttpException;
}
步骤4 - 在Web浏览器的地址栏中输入 http://localhost:8080/index.php?r=site/test-response ,您可以看到下图中所示的 410 Gone 响应HTTP状态。
步骤5 − 通过修改响应组件的 headers 属性,您可以发送HTTP标头。要在响应中添加一个新的标头,请修改 actionTestResponse 函数,如下所示的代码。
public function actionTestResponse() {
Yii::$app->response->headers->add('Pragma', 'no-cache');
}
步骤6 - 前往 http://localhost:8080/index.php?r=site/test-response, 您将看到我们的Pragma头。
Yii支持以下响应格式:
- HTML - 由yii\web\HtmlResponseFormatter实现。
-
XML - 由yii\web\XmlResponseFormatter实现。
-
JSON - 由yii\web\JsonResponseFormatter实现。
-
JSONP - 由yii\web\JsonResponseFormatter实现。
-
RAW - 无格式化的响应。
步骤7 - 要以JSON格式响应,请修改 actionTestResponse 函数。
public function actionTestResponse() {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return [
'id' => '1',
'name' => 'Ivan',
'age' => 24,
'country' => 'Poland',
'city' => 'Warsaw'
];
}
步骤8 − 现在,在地址栏中键入 http://localhost:8080/index.php?r=site/test-response ,您将看到以下内容的 JSON 响应。
Yii通过发送一个Location HTTP头实现浏览器重定向。您可以调用 yii\web\Response::redirect() 方法将用户浏览器重定向到一个URL。
步骤9 - 按照以下方式修改 actionTestResponse 函数。
public function actionTestResponse() {
return $this->redirect('http://www.tutorialspoint.com/');
}
现在,如果你打开 http://localhost:8080/index.php?r=site/test-response ,你的浏览器将会重定向到 TutorialsPoint 网站。
发送文件
Yii提供了以下方法来支持文件发送:
- yii\web\Response::sendFile() - 发送一个已存在的文件。
-
yii\web\Response::sendStreamAsFile() - 将已存在的文件流发送为一个文件。
-
yii\web\Response::sendContentAsFile() - 将文本字符串作为文件发送。
按照以下方式修改actionTestResponse功能:
public function actionTestResponse() {
return \Yii::$app->response->sendFile('favicon.ico');
}
类型 http://localhost:8080/index.php?r=site/test-response ,你将会看到一个下载弹窗,下载 favicon.ico 文件 –
直到调用 yii\web\Response::send() 函数,响应才被发送。默认情况下,该方法在 yii\base\Application::run() 方法结束时调用。要发送响应, yii\web\Response::send() 方法遵循以下步骤:
- 触发yii\web\Response::EVENT_BEFORE_SEND事件。
- 调用yii\web\Response::prepare()方法。
- 触发yii\web\Response::EVENT_AFTER_PREPARE事件。
- 调用yii\web\Response::sendHeaders()方法。
- 调用yii\web\Response::sendContent()方法。
- 触发yii\web\Response::EVENT_AFTER_SEND事件。