我的中间件需求是:
- 向派生自
GuzzleHttpCommandGuzzleGuzzleClient
的 REST API 客户端发出的请求添加额外的查询参数
通过客户端调用 API 时,我无法直接执行此操作,因为GuzzleClient
使用 API 规范并且只传递"合法"查询参数。因此,我必须安装一个中间件,以便在 API 客户端准备好 HTTP 请求后拦截它们。
我目前所在的赛道:
$apiClient->getHandlerStack()-push($myMiddleware)
问题:
我无法弄清楚组装$myMiddleware
必须成为的功能俄罗斯娃娃的正确方法。这是一个疯狂的Gazilliardth-order 函数场景,应该编写函数的确切正确方式似乎与直接使用GuzzleHttpClient
时广泛记录的做事方式不同。无论我尝试什么,我最终都会将错误的东西传递给 matryoshka 的某个层,导致参数类型错误,或者我最终从层返回错误的内容,导致 Guzzle 代码中的类型错误。
我做了一个仔细权衡的决定,放弃试图理解。请给我一个GuzzleHttpCommandGuzzleGuzzleClient
的样板解决方案,而不是GuzzleHttpClient
。
用于处理GuzzleHttpCommandGuzzleGuzzleClient
中间件的HandlerStack
可以在序列化命令之前转换/验证命令,也可以在命令返回后处理结果。 如果要在命令转换为请求之后,但在实际发送之前修改命令,则可以使用与不使用GuzzleClient
相同的中间件方法 - 创建中间件并将其附加到作为第一个参数传递给GuzzleClient
的GuzzleHttpClient
实例。
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