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→re​​sponse->statusCode = 201;
}

步骤 2 − 如果您将 Web 浏览器指向 http://localhost:8080/index.php?r=site/testresponse,您应该注意到 201 Created response HTTP 状态。

Created response HTTP status

如果您想表明请求不成功,您可以抛出一个预定义的 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 状态,如下图所示。

Gone Response HTTP Status

步骤 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 标头。

Pragma header

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 响应。

JSON response

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 文件的对话框窗口 −

favicon.ico File

直到调用 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 事件。