108 lines
3.1 KiB
PHP
Executable File
108 lines
3.1 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use CodeIgniter\HTTP\CURLRequest;
|
|
use Config\Api as ApiConfig;
|
|
|
|
class ApiClient
|
|
{
|
|
protected CURLRequest $http;
|
|
protected ApiConfig $config;
|
|
|
|
public function __construct(CURLRequest $http, ApiConfig $config)
|
|
{
|
|
$this->http = $http;
|
|
$this->config = $config;
|
|
}
|
|
|
|
public function get(string $uri, array $query = [], array $headers = []): array
|
|
{
|
|
return $this->request('get', $uri, [
|
|
'headers' => $this->mergeHeaders($headers),
|
|
'query' => $query,
|
|
]);
|
|
}
|
|
|
|
public function post(string $uri, array $data = [], array $headers = []): array
|
|
{
|
|
return $this->request('post', $uri, [
|
|
'headers' => $this->mergeHeaders($headers, ['Content-Type' => 'application/json']),
|
|
'json' => $data,
|
|
]);
|
|
}
|
|
|
|
public function put(string $uri, array $data = [], array $headers = []): array
|
|
{
|
|
return $this->request('put', $uri, [
|
|
'headers' => $this->mergeHeaders($headers, ['Content-Type' => 'application/json']),
|
|
'json' => $data,
|
|
]);
|
|
}
|
|
|
|
public function delete(string $uri, array $data = [], array $headers = []): array
|
|
{
|
|
return $this->request('delete', $uri, [
|
|
'headers' => $this->mergeHeaders($headers, ['Content-Type' => 'application/json']),
|
|
'json' => $data,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Low-level access for uncommon HTTP methods or options
|
|
*/
|
|
public function request(string $method, string $uri, array $options = []): array
|
|
{
|
|
$url = $this->fullUrl($uri);
|
|
$options['timeout'] = $options['timeout'] ?? $this->config->timeout;
|
|
|
|
$response = $this->http->request(strtoupper($method), $url, $options);
|
|
|
|
$status = $response->getStatusCode();
|
|
$body = (string) $response->getBody();
|
|
|
|
$decoded = null;
|
|
if ($this->isJson($body)) {
|
|
$decoded = json_decode($body, true);
|
|
}
|
|
|
|
return [
|
|
'ok' => $status >= 200 && $status < 300,
|
|
'status' => $status,
|
|
'headers' => $response->getHeaderLine('Content-Type'),
|
|
'data' => $decoded,
|
|
'raw' => $decoded === null ? $body : null,
|
|
];
|
|
}
|
|
|
|
protected function fullUrl(string $uri): string
|
|
{
|
|
if (preg_match('#^https?://#i', $uri)) {
|
|
return $uri;
|
|
}
|
|
|
|
$base = rtrim($this->config->baseURL ?? '', '/');
|
|
if ($base === '') {
|
|
return '/' . ltrim($uri, '/');
|
|
}
|
|
return $base . '/' . ltrim($uri, '/');
|
|
}
|
|
|
|
protected function mergeHeaders(array $override = [], array $extra = []): array
|
|
{
|
|
$base = $this->config->defaultHeaders ?? [];
|
|
return array_filter(array_merge($base, $extra, $override), static function ($v) {
|
|
return $v !== null && $v !== '';
|
|
});
|
|
}
|
|
|
|
protected function isJson(string $string): bool
|
|
{
|
|
json_decode($string);
|
|
return json_last_error() === JSON_ERROR_NONE;
|
|
}
|
|
}
|
|
|
|
?>
|
|
|