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 浏览器指向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 标头。
    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.cainiaoya.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 事件。