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狀態。
Yii響應

第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響應
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響應

Yii通過發送定位HTTP頭實現了一個瀏覽器重定向。可以調用 yii\web\Response::redirect() 方法將用戶瀏覽器重定向到URL。

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

現在在瀏覽器中打開:http://localhost:8080/index.php?r=site/test-response,  瀏覽器將被重定向到 www.yiibai.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響應

響應不會發送,直到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 事件