Yii - 响应
当 Web 应用程序处理请求时,它会生成一个响应对象,其中包含 HTTP 标头、正文和 HTTP 状态代码。在大多数情况下,您将使用响应应用程序组件。默认情况下,它是 yii\web\Response 的一个实例。
要管理响应 HTTP 状态代码,请使用 yii\web\Response::$statusCode 属性。yii\web\Response::$statusCode 的默认值为 200。
步骤 1 − 将名为 actionTestResponse 的函数添加到 SiteController。
public function actionTestResponse() { Yii::$app→response->statusCode = 201; }
步骤 2 − 如果您将 Web 浏览器指向 http://localhost:8080/index.php?r=site/testresponse,您应该注意到 201 Created response HTTP 状态。
如果您想表明请求不成功,您可以抛出一个预定义的 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 事件。