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 响应 HTTP 状态。

创建响应 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 状态,如下图所示。

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

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

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 事件。