Response 对象

响应客户端的请求

生命周期

Response 对象在系统中以单例模式存在,自收到客户端 HTTP 请求时自动创建,直至请求结束自动销毁。Response 对象完全符合 PSR-7 中的所有规范。 其他细节方法,有兴趣的同学可以在 IDE 中查看对应的代码。

在控制器中可以通过 $this->response() 获取到 Response 对象。

  1. $response = $this->response();

核心方法

write

向客户响应数据。

  1. // 向客户端响应 字符串数据
  2. $this->response()->write('hello world');

注意:当向客户端响应中文字符串时,请务必设置响应头,并在 Content-Type 属性中指定编码,否则将显示乱码。

示例:

  1. // 向客户端响应 中文字符串
  2. // 设置响应头,并在 `Content-Type` 属性中指定编码
  3. $this->response()->withHeader('Content-Type', 'text/html;charset=utf-8');
  4. $this->response()->write('你好! easyswoole!');
  5. // 向客户端响应 json 字符串
  6. $this->response()->withHeader('Content-Type', 'application/json;charset=utf-8');
  7. $this->response()->write(json_encode(['name' => 'easyswoole']));

在控制器中可直接调用 $this->writeJson($statusCode = 200, $result = null, $msg = null) 方法向客户端响应 json 字符串

示例:

  1. // 在 `easyswoole` 控制器中,向客户端响应 json 字符串
  2. $this->writeJson(200, ['name' => 'easyswoole'], 'success!');

redirect

将请求重定向至指定的 URL

  1. $this->response()->redirect("/newURL/index.html");

setCookie

向客户端设置一个 Cookie,用法与 PHP 原生的 setcookie 一致。

  1. $this->response()->setCookie(string $name, $value = null, $expire = null,string $path = '/', string $domain = '', bool $secure = false, bool $httponly = false, string $samesite = '')

getSwooleResponse

获取原始的 swoole_http_response 实例。

  1. $swooleResponse = $this->response()->getSwooleResponse();

end

结束对该次 HTTP 请求响应,结束之后,无法再次向客户端响应数据。

  1. $this->response()->end();

注意:和 Swoole 原生 swoole_http_response 实例的 end 方法有所区别。

isEndResponse

判断该次 HTTP 请求是否结束响应,当你不知道是否已经结束响应时,可通过该方法判断是否能再次向客户端响应数据:

  1. if (!$this->response()->isEndResponse()) {
  2. $this->response()->write('继续发送数据');
  3. }

withStatus

向客户端发送 HTTP 状态码。

  1. $this->response()->withStatus($statusCode);

注意:$statusCode 必须为标准的 HTTP 允许状态码,具体请见 Http Message 中 的 Status 对象

withHeader

用于向 HTTP 客户端发送一个 header

  1. $this->response()->withHeader('Content-Type', 'application/json;charset=utf-8');

其他响应

向客户端响应文件流,实现文件下载

  1. 实现 excel 文件自动下载

示例如下:在控制器中响应客户端,实现 excel 文件自动下载

  1. <?php
  2. namespace App\HttpController;
  3. use EasySwoole\Http\AbstractInterface\Controller;
  4. class Index extends Controller
  5. {
  6. function index()
  7. {
  8. // 获取指定路径下的 excel 文件,例如这里获取项目根目录下的 test.xlsx 文件
  9. $this->response()->write(file_get_contents(EASYSWOOLE_ROOT . '/test.xlsx'));
  10. // 设置文件流内容类型
  11. $this->response()->withHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  12. // 设置要下载的文件名称,一定要带文件类型后缀
  13. $this->response()->withHeader('Content-Disposition', 'attachment;filename=' . 'download_test.xlsx');
  14. $this->response()->withHeader('Cache-Control', 'max-age=0');
  15. $this->response()->end();
  16. }
  17. }

访问 http://localhost:9501/ 就会自动下载 download_test.xlsx 文件了。

注意:这里必须使用 withHeader 设置响应头,一定不能使用 php-fpm 下的 header 函数设置。