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 - 如果您将 Web 浏览器指向https://127.0.0.1:8080/index.php?r=site/testresponse,您应该会注意到 201 已创建的响应 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 浏览器的地址栏中键入https://127.0.0.1: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 - 转到https://127.0.0.1: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 - 现在,在地址栏中键入https://127.0.0.1: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('https://tutorialspoint.com/');
}

现在,如果您访问https://127.0.0.1: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');
}

键入https://127.0.0.1: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 事件。
广告