sokil / php-rest-api-client

0.1.0 2024-08-31 20:01 UTC

This package is auto-updated.

Last update: 2024-08-31 20:05:04 UTC


README

安装

$ composer require sokil/php-rest-api-client

配置

基本API URI

任何请求都可能包含指向REST API的绝对路径。如果所有请求都指向同一个api,您可以定义基本路径

$restApiClient = new RestApiClient(
    $psrHttpClient,
    $psrRequestFactory,
    $psrUriFactory,
    null,
    null,
    "https://api.example.com/some-prefix"
);

基本API URI必须不包含尾部斜杠。

合并规则

用法

创建HTTP客户端。客户端基于PSR-18 Http Client和PSR-17 Http Factories

<?php

use Sokil\RestApiClient\RestApiClient;

$restApiClient = new RestApiClient(
    $psrHttpClient,
    $psrRequestFactory,
    $psrUriFactory,
    null,
    null,
);

创建请求类

<?php

use Psr\Http\Message\ResponseInterface;
use Sokil\RestApiClient\Request\AbstractApiRequest

class GetResourceByIdRequest extends AbstractApiRequest
{
    public function __construct(
        private readonly string $id
    ) {
        parent::__construct(
            'GET',
            sprintf('/v1/resources/%s', $this->id),
        );
    }

    public function parseResponse(ResponseInterface $response): ?object
    {
        if ($response->getStatusCode() !== 200) {
            throw new \Exception('Response code not ok');
        }

        return new SomeResourceDTO();
    }
}

调用API端点

class MyService
{
    public function getResource(): object
    {
        $id = 'id_string';
        $result = $this->restApiClient->call(new GetResourceByIdRequest($id))

        return $result;
    }
}

使用OAuth授权

REST客户端必须构建时带有额外的OAuth2客户端参数

<?php

use Sokil\RestApiClient\RestApiClient;
use Sokil\RestApiClient\Auth\OAuth2\OAuth2Client;
use Sokil\RestApiClient\Auth\OAuth2\AuthTokenStorage\SimpleCacheAuthTokenStorage;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpClient\Psr18Client;
use Symfony\Component\Cache\Psr16Cache;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Psr\Log\NullLogger;

$symfonyClient = HttpClient::createForBaseUri(getenv('API_HOST'));
$psrHttpClient = new Psr18Client($symfonyClient);

// used to authorize on authorization server, store and refresh stored access token
$oAuth2Client = new OAuth2Client(
    getenv('AUTH_API_HOST'),
    getenv('AUTH_CLIENT_ID'),
    getenv('AUTH_CLIENT_SECRET'),
    $psrHttpClient,
    $psrHttpClient,
    new SimpleCacheAuthTokenStorage(new Psr16Cache(new ArrayAdapter())),
    new NullLogger(),
);

$restApiClient = new RestApiClient(
    $psrHttpClient,
    $psrHttpClient,
    $psrHttpClient,
    $psrHttpClient,
    $oAuth2Client,
);

您的请求类必须实现OAuth2AuthorizationAwareInterface

<?php

use Psr\Http\Message\ResponseInterface;
use Sokil\RestApiClient\Request\AbstractApiRequest
use Sokil\RestApiClient\Auth\OAuth2\OAuth2AuthorizationAwareInterface

class GetResourceByIdRequest extends AbstractApiRequest implements OAuth2AuthorizationAwareInterface
{
    public function __construct(
        private readonly string $id
    ) {
        parent::__construct(
            'GET',
            sprintf('/v1/resource/%s', $this->id),
        );
    }

    public function parseResponse(ResponseInterface $response): ?object
    {
        if ($response->getStatusCode() !== 200) {
            throw new \Exception('Response code not ok');
        }

        $body = $this->jsonResponseToArray($response);

        if (empty($body) || !isset($body['resource'])) {
            throw new \Exception('Response body invalid');
        }

        return new YourResponseDto(..$values);
    }
}

基于令牌的授权

REST客户端必须构建时带有额外的token secret provider客户端参数

<?php

use Sokil\RestApiClient\RestApiClient;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpClient\Psr18Client;
use Symfony\Component\Cache\Psr16Cache;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Sokil\RestApiClient\HeaderSecretAuth\SimpleSecretProvider;
use Psr\Log\NullLogger;

$symfonyClient = HttpClient::createForBaseUri(getenv('API_HOST'));
$psrHttpClient = new Psr18Client($symfonyClient);

// used to authorize on authorization server, store and refresh stored access token
$oAuth2Client = ;

$restApiClient = new RestApiClient(
    $psrHttpClient,
    $psrHttpClient,
    $psrHttpClient,
    null,
    new SimpleHeaderSecretProvider(
        getenv('TOKAN_AUTH_HEADER_NAME'),
        getenv('TOKAN_AUTH_SECRET'),
    )
);

您的请求类必须实现HeaderSecretAuthorizationAwareInterface

<?php

use Psr\Http\Message\ResponseInterface;
use Sokil\RestApiClient\Request\AbstractApiRequest
use Sokil\RestApiClient\Auth\OAuth2\OAuth2AuthorizationAwareInterface

class GetResourceByIdRequest extends AbstractApiRequest implements HeaderSecretAuthorizationAwareInterface
{
    public function __construct(
        private readonly string $id
    ) {
        parent::__construct(
            'GET',
            sprintf('/v1/resource/%s', $this->id),
        );
    }

    public function parseResponse(ResponseInterface $response): ?object
    {
        if ($response->getStatusCode() !== 200) {
            throw new \Exception('Response code not ok');
        }

        $body = $this->jsonResponseToArray($response);

        if (empty($body) || !isset($body['resource'])) {
            throw new \Exception('Response body invalid');
        }

        return new YourResponseDto(..$values);
    }
}