{guzzle-services}如何使用GuzzleClient客户端的中间件直接与原始GuzzleHttp \ Client一起使用?

时间:2018-05-22 16:05:25

标签: guzzle6

我的中间件需要是:

  • 为源自GuzzleHttp\Command\Guzzle\GuzzleClient
  • 的REST API客户端发出的请求添加额外的查询参数

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

我目前的赛道:

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

问题:

我无法弄清楚组装$myMiddleware必须使用的功能性俄罗斯玩偶的正确方法。这是一个疯狂 gazilliardth-order函数场景,并且完全正确的方式应该写入函数似乎不同与广泛记录的方式在直接使用GuzzleHttp\Client时做事。无论我尝试什么,我最终都会将错误的东西传递给matryoshka的某个层,导致参数类型错误,或者我最终从图层返回错误,导致Guzzle代码中出现类型错误。

我做了一个谨慎加权的决定,放弃试图理解。请给我一个针对GuzzleHttp\Command\Guzzle\GuzzleClient的样板解决方案,而不是GuzzleHttp\Client

2 个答案:

答案 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;
 }

此处有更多示例:https://hotexamples.com/examples/guzzlehttp/Middleware/mapRequest/php-middleware-maprequest-method-examples.html