sokil / php-rest-api-client
0.1.0
2024-08-31 20:01 UTC
Requires
- php: ^8.2
- psr/http-client: ^1.0
- psr/http-factory: ^1.0
- psr/log: >=1.0
- psr/simple-cache: ^1.0|^2.0|^3.0
Requires (Dev)
- nyholm/psr7: ^1.5
- phpunit/phpunit: ^10.5
- symfony/cache: ^6.0|^7.0
- symfony/http-client: ^6.0|^7.0
- vimeo/psalm: ^5.25
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); } }