{guzzle-services} 如何将中间件与 GuzzleClient 客户端一起使用,而不是直接使用原始 Guz



我的中间件需求是:

  • 向派生自GuzzleHttpCommandGuzzleGuzzleClient的 REST API 客户端发出的请求添加额外的查询参数

通过客户端调用 API 时,我无法直接执行此操作,因为GuzzleClient使用 API 规范并且只传递"合法"查询参数。因此,我必须安装一个中间件,以便在 API 客户端准备好 HTTP 请求拦截它们。

我目前所在的赛道:

  • $apiClient->getHandlerStack()-push($myMiddleware)

问题:

我无法弄清楚组装$myMiddleware必须成为的功能俄罗斯娃娃的正确方法。这是一个疯狂的Gazilliardth-order 函数场景,应该编写函数的确切正确方式似乎与直接使用GuzzleHttpClient时广泛记录的做事方式不同。无论我尝试什么,我最终都会将错误的东西传递给 matryoshka 的某个层,导致参数类型错误,或者我最终从层返回错误的内容,导致 Guzzle 代码中的类型错误。

我做了一个仔细权衡的决定,放弃试图理解。请给我一个GuzzleHttpCommandGuzzleGuzzleClient的样板解决方案,而不是GuzzleHttpClient

用于处理GuzzleHttpCommandGuzzleGuzzleClient中间件的HandlerStack可以在序列化命令之前转换/验证命令,也可以在命令返回后处理结果。 如果要在命令转换为请求之后,但在实际发送之前修改命令,则可以使用与不使用GuzzleClient相同的中间件方法 - 创建中间件并将其附加到作为第一个参数传递给GuzzleClientGuzzleHttpClient实例。

use GuzzleHttpClient;
use GuzzleHttpHandlerStack;
use GuzzleHttpCommandGuzzleGuzzleClient;
use GuzzleHttpCommandGuzzleDescription;
class MyCustomMiddleware
{
public function __invoke(callable $handler) {
return function (RequestInterface $request, array $options) use ($handler) {
// ... do something with request
return $handler($request, $options);
}
}
}

$handlerStack = HandlerStack::create();
$handlerStack->push(new MyCustomMiddleware);
$config['handler'] = $handlerStack;
$apiClient = new GuzzleClient(new Client($config), new Description(...));

GuzzleClient的样板解决方案与GuzzleHttpClient相同,因为无论是否使用 Guzzle 服务,您的请求修改中间件都需要继续GuzzleHttpClient

您也可以使用

$handler->push(Middleware::mapRequest(function(){...});

操纵请求的各种方式。我不是100%确定这是你要找的东西。 但是我假设您可以将额外的参数添加到那里的请求中。

private function createAuthStack()
{
$stack = HandlerStack::create();
$stack->push(Middleware::mapRequest(function (RequestInterface $request) {
return $request->withHeader('Authorization', "Bearer " . $this->accessToken);
}));
return $stack;
}

更多示例在这里: https://hotexamples.com/examples/guzzlehttp/Middleware/mapRequest/php-middleware-maprequest-method-examples.html

最新更新