Response 對象
響應(yīng)客戶端的請求
生命周期
Response
對象在系統(tǒng)中以單例模式存在,自收到客戶端 HTTP
請求時自動創(chuàng)建,直至請求結(jié)束自動銷毀。Response
對象完全符合 PSR-7 中的所有規(guī)范。
其他細節(jié)方法,有興趣的同學(xué)可以在 IDE
中查看對應(yīng)的代碼。
在控制器中可以通過 $this->response()
獲取到 Response
對象。
$response = $this->response();
核心方法
write
向客戶響應(yīng)數(shù)據(jù)。
// 向客戶端響應(yīng) 字符串?dāng)?shù)據(jù)
$this->response()->write('hello world');
注意:當(dāng)向客戶端響應(yīng)中文字符串時,請務(wù)必設(shè)置響應(yīng)頭,并在
Content-Type
屬性中指定編碼,否則將顯示亂碼。
示例:
// 向客戶端響應(yīng) 中文字符串
// 設(shè)置響應(yīng)頭,并在 `Content-Type` 屬性中指定編碼
$this->response()->withHeader('Content-Type', 'text/html;charset=utf-8');
$this->response()->write('你好! easyswoole!');
// 向客戶端響應(yīng) json 字符串
$this->response()->withHeader('Content-Type', 'application/json;charset=utf-8');
$this->response()->write(json_encode(['name' => 'easyswoole']));
在控制器中可直接調(diào)用 $this->writeJson($statusCode = 200, $result = null, $msg = null)
方法向客戶端響應(yīng) json 字符串
示例:
// 在 `easyswoole` 控制器中,向客戶端響應(yīng) json 字符串
$this->writeJson(200, ['name' => 'easyswoole'], 'success!');
redirect
將請求重定向至指定的 URL
$this->response()->redirect("/newURL/index.html");
setCookie
向客戶端設(shè)置一個 Cookie
,用法與 PHP
原生的 setcookie
一致。
$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
實例。
$swooleResponse = $this->response()->getSwooleResponse();
end
結(jié)束對該次 HTTP
請求響應(yīng),結(jié)束之后,無法再次向客戶端響應(yīng)數(shù)據(jù)。
$this->response()->end();
注意:和
Swoole
原生swoole_http_response
實例的end
方法有所區(qū)別。
isEndResponse
判斷該次 HTTP
請求是否結(jié)束響應(yīng),當(dāng)你不知道是否已經(jīng)結(jié)束響應(yīng)時,可通過該方法判斷是否能再次向客戶端響應(yīng)數(shù)據(jù):
if (!$this->response()->isEndResponse()) {
$this->response()->write('繼續(xù)發(fā)送數(shù)據(jù)');
}
withStatus
向客戶端發(fā)送 HTTP
狀態(tài)碼。
$this->response()->withStatus($statusCode);
注意:$statusCode
必須為標(biāo)準(zhǔn)的 HTTP 允許狀態(tài)碼
,具體請見 Http Message
中 的 Status 對象。
withHeader
用于向 HTTP
客戶端發(fā)送一個 header
。
$this->response()->withHeader('Content-Type', 'application/json;charset=utf-8');
其他方法
用于獲取響應(yīng)內(nèi)容,即需要響應(yīng)給客戶端的數(shù)據(jù)。一般用于在響應(yīng)客戶端之前記錄響應(yīng)日志之類的業(yè)務(wù)。具體使用可查看框架的 afterRequest
事件
$this->response()->getBody()->__toString();
其他響應(yīng)
向客戶端響應(yīng)文件流,實現(xiàn)文件下載
- 實現(xiàn)
excel
文件自動下載
示例如下:在控制器中響應(yīng)客戶端,實現(xiàn) excel
文件自動下載
<?php
namespace App\HttpController;
use EasySwoole\Http\AbstractInterface\Controller;
class Index extends Controller
{
function index()
{
// 要下載 excel 文件的指定路徑,例如這里是項目根目錄下的 test.xlsx 文件
$this->response()->sendFile(EASYSWOOLE_ROOT . '/test.xlsx');
// 設(shè)置文件流內(nèi)容類型,這里以 xlsx 為例
$this->response()->withHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
// 設(shè)置要下載的文件名稱,一定要帶文件類型后綴
$this->response()->withHeader('Content-Disposition', 'attachment;filename=' . 'download_test.xlsx');
$this->response()->withHeader('Cache-Control', 'max-age=0');
$this->response()->end();
}
}
訪問 http://localhost:9501/
就會自動下載 download_test.xlsx
文件了。
注意:這里必須使用
withHeader
設(shè)置響應(yīng)頭,一定不能使用php-fpm
下的header
函數(shù)設(shè)置。