了解如何拦截 SDK 发起的请求,并统一添加额外的逻辑。
UCloud SDK 为请求提供了请求中间件的特性。
该特性允许在 请求/响应 的生命周期中添加自定义的逻辑。
例如,Client 级别的中间件,可以拦截参数/响应字典:
use UCloud\Core\Middleware\Context;
use UCloud\Core\Middleware\Middleware;
use UCloud\Core\Request\Request;
use UCloud\Core\Response\Response;
class LogMiddleware extends Middleware
{
public function handleRequest(Context $ctx): Request
{
$req = $ctx->getRequest();
$logger = $ctx->getConfig()->getLogger();
if ($logger != null) {
$logger->info(sprintf("[request] %s", json_encode($req->toArray())));
}
return $req;
}
public function handleResponse(Context $ctx): Response
{
$resp = $ctx->getResponse();
$logger = $ctx->getConfig()->getLogger();
if ($logger != null) {
$body = $resp->toArray();
$logger->info(sprintf("[response: %s] %s", $resp->getRequestId(), json_encode($body)));
}
return $resp;
}
public function handleException(Context $ctx)
{
$e = $ctx->getException();
$logger = $ctx->getConfig()->getLogger();
if ($logger != null) {
$logger->error(sprintf("[response: %s] %s Error: %s", $e->getRequestId(), $e->getType(), $e->getMessage()));
}
}
}