我的中间件需要是:
GuzzleHttp\Command\Guzzle\GuzzleClient
在通过客户端调用API时,我无法直接执行此操作,因为GuzzleClient
使用API规范,并且它仅传递“合法”查询参数。因此,在 API客户端准备它们之后,我必须安装一个中间件来拦截HTTP请求。
我目前的赛道:
$apiClient->getHandlerStack()-push($myMiddleware)
问题:
我无法弄清楚组装$myMiddleware
必须使用的功能性俄罗斯玩偶的正确方法。这是一个疯狂 gazilliardth-order函数场景,并且完全正确的方式应该写入函数似乎不同与广泛记录的方式在直接使用GuzzleHttp\Client
时做事。无论我尝试什么,我最终都会将错误的东西传递给matryoshka的某个层,导致参数类型错误,或者我最终从图层返回错误,导致Guzzle代码中出现类型错误。
我做了一个谨慎加权的决定,放弃试图理解。请给我一个针对GuzzleHttp\Command\Guzzle\GuzzleClient
的样板解决方案,而不是GuzzleHttp\Client
。
答案 0 :(得分:3)
HandlerStack
中用于处理中间件的GuzzleHttp\Command\Guzzle\GuzzleClient
可以在序列化之前转换/验证命令,也可以在命令返回后处理结果。如果要在命令变为请求之后但在实际发送之前修改命令,那么您将使用与中间件相同的方法,就像您没有使用GuzzleClient
一样 - 创建并附加中间件到作为GuzzleHttp\Client
的第一个参数传递的GuzzleClient
实例。
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Command\Guzzle\GuzzleClient;
use GuzzleHttp\Command\Guzzle\Description;
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
的样板解决方案与GuzzleHttp\Client
相同,因为无论是否使用Guzzle服务,您的请求修改中间件都需要继续GuzzleHttp\Client
。
答案 1 :(得分:0)
您也可以使用
$handler->push(Middleware::mapRequest(function(){...});
Of用来处理请求。我不是100%肯定这是您要寻找的东西。但是我认为您可以在其中将额外的参数添加到“请求”中。
private function createAuthStack()
{
$stack = HandlerStack::create();
$stack->push(Middleware::mapRequest(function (RequestInterface $request) {
return $request->withHeader('Authorization', "Bearer " . $this->accessToken);
}));
return $stack;
}