实现包装Guzzle PHP的服务客户端的最佳实践

时间:2018-12-20 22:46:42

标签: php laravel unit-testing pagination guzzle

我必须构建一个PHP类,基本上是一个包装Guzzles php客户端的客户端,以获取数据并将其发送到REST API。该客户将坐在Laravel应用所需的作曲家程序包中

以一种可以测试程序包/客户端的方式实现此目标的最佳方法是什么。

当前,我的实现是在“ call()”类中有一个方法 这将包裹着Guzzles-> request

类似于

    public function call(string $method , string $path, array $query = [], array $auth = [])
    {
        $query   = array_merge($query, ['api_key' => $this->apikey]);
        $uriPath = $this->buildApiUri($path);

        try {
            $resp = $this->client->request($method, $uriPath, [
                'auth'  => $auth,
                'query' => $query,
            ]);

        } catch (RequestException $e) {
            Log::error('FAIL ' . $uriPath . ' fetch: ' . $e->getMessage());
        }

        return $this->jsonDecodeOrError($uriPath, $resp);
    } 

  protected function buildApiUri($path)
    {
        return '/api/' . $this->api_version . $path;
    }

我还认为测试此问题的唯一方法是将guzzle客户端传递到我自己的客户端中,这样我就可以利用Guzzles模拟处理程序

use GuzzleHttp\Client;

public function __construct($apikey, Client $client, $max_retries = 5)

我的客户端只有少数几种方法,它们从本质上调用了各种其他终结点。

我面临的另一个问题是分页。我正在使用的其余API返回分页数据,我想在客户端中处理分页。

即-如果对 / users 的调用每页返回 10个用户,总共100个用户,我希望使用-> getUsers() 客户类中的方法可返回100条记录。

可以利用耗时的方法,或者我遍历每个请求,直到从API获得所有记录为止。

该软件包不需要特定于Laravel(服务提供商)

预先感谢

0 个答案:

没有答案