alf89 / http-client
Легковесный HTTP-клиент для PHP
Requires
- php: ^8.5
- ext-curl: *
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-21 09:29:49 UTC
README
HTTP Client
Легковесный HTTP-клиент для PHP без зависимости фреймворков.
Пакет предоставляет простой интерфейс для выполнения HTTP-запросов через PHP cURL.
Возможности
- GET
- POST
- PUT
- PATCH
- DELETE
- Query parameters
- HTTP headers
- JSON request body
- Получение HTTP status code
- Получение response headers
- Получение response body
- Обработка ошибок cURL
Facadeдля удобного использования- Разделение HTTP-клиента и transport-слоя через интерфейсы
- PSR-4 autoloading
- Управление проверкой SSL-сертификата
- Настройка таймаута подключения
- Настройка таймаута запроса
Требования
- PHP 8.5+
- PHP extension
ext-curl
Установка
Установите пакет через Composer:
composer require alf89/http-client
Конфигурация
Настройки HTTP-клиента находятся в:
src/Config/Config.php
На данный момент конфигурация задаётся непосредственно в классе Config.
Текущие значения по умолчанию:
readonly class Config { public function __construct( private int $timeout = 30, private int $connectTimeout = 5, private string $userAgent = 'alf89/http-client/1.0', private bool $verifyPeer = true, ) {} }
Использование
Для работы с HTTP-клиентом используется Http Facade.
Создавать HttpClientService, CurlTransport или другие внутренние компоненты вручную не требуется.
GET
Простой GET-запрос:
<?php require __DIR__ . '/vendor/autoload.php'; use alf89\HttpClient\Facades\Http; $response = Http::get( 'https://httpbin.org/get' ); echo $response->getStatusCode();
GET с headers
$response = Http::get( 'https://httpbin.org/get', [ 'Accept: application/json', ] );
GET с query parameters
$response = Http::get( 'https://httpbin.org/get', [ 'Accept: application/json', ], [ 'page' => 2, 'limit' => 10, ] );
В результате будет выполнен запрос:
https://httpbin.org/get?page=2&limit=10
POST
В текущей версии POST отправляет тело запроса в формате JSON.
$response = Http::post( 'https://httpbin.org/post', [ 'Accept: application/json', 'Content-Type: application/json', ], [ 'name' => 'Roman', 'age' => 36, ] );
В HTTP body будет отправлено:
{
"name": "Roman",
"age": 36
}
PUT
$response = Http::put( 'https://httpbin.org/put', [ 'Accept: application/json', 'Content-Type: application/json', ], [ 'name' => 'Roman', ] );
PATCH
$response = Http::patch( 'https://httpbin.org/patch', [ 'Accept: application/json', 'Content-Type: application/json', ], [ 'name' => 'Roman', ] );
DELETE
Query parameters передаются третьим аргументом:
$response = Http::delete( 'https://httpbin.org/delete', [ 'Accept: application/json', ], [ 'id' => 123, ] );
Будет выполнен запрос:
https://httpbin.org/delete?id=123
Response
Все запросы возвращают объект, реализующий:
alf89\HttpClient\Contracts\ResponseInterface
HTTP status code
$statusCode = $response->getStatusCode();
Например:
200
Response headers
$headers = $response->getHeaders();
Пример:
[
'date' => 'Tue, 25 Aug 2026 11:52:11 GMT',
'content-type' => 'application/json',
'content-length' => '595',
'server' => 'gunicorn/19.9.0',
]
Response body
$body = $response->getBody();
Возвращается строка с телом HTTP-ответа.
Для JSON:
$data = json_decode( $response->getBody(), true, flags: JSON_THROW_ON_ERROR );
Обработка ошибок
ConnectionException
Если cURL не смог выполнить запрос, выбрасывается:
alf89\HttpClient\Exceptions\ConnectionException
Например, при ошибке DNS:
use alf89\HttpClient\Exceptions\ConnectionException; use alf89\HttpClient\Facades\Http; try { $response = Http::get( 'https://httpbin111.org' ); } catch (ConnectionException $exception) { echo $exception->getMessage(); echo $exception->getCurlErrorCode(); }
ConnectionException содержит:
$exception->getMessage();
Сообщение об ошибке cURL.
$exception->getCurlErrorCode();
Код ошибки cURL.
Пример:
Could not resolve host: httpbin111.org
HTTP ошибки
HTTP-статус 4xx или 5xx означает, что сервер ответил.
В текущей версии такие ответы возвращаются как обычный Response.
Например:
$response = Http::get( 'https://httpbin.org/status/404' ); echo $response->getStatusCode();
Результат:
404
Таким образом:
Ошибка cURL
↓
ConnectionException
HTTP 4xx / 5xx
↓
Response
HttpException
Пакет также содержит:
alf89\HttpClient\Exceptions\HttpException
Класс предоставляет:
$exception->getStatusCode(); $exception->getBody(); $exception->getMessage();
В текущей версии HttpException не выбрасывается автоматически при получении HTTP-статуса 4xx или 5xx.
Facade
Http является основной и рекомендуемой точкой входа в пакет.
use alf89\HttpClient\Facades\Http; $response = Http::get(...); $response = Http::post(...); $response = Http::put(...); $response = Http::patch(...); $response = Http::delete(...);
Facade самостоятельно создаёт необходимые внутренние зависимости.
Пользователю пакета не требуется создавать:
HttpClientService
CurlTransport
вручную.
Архитектура
Пакет разделён на несколько уровней:
Http Facade
↓
HttpClientService
↓
TransportInterface
↓
CurlTransport
↓
PHP cURL
↓
Response
Contracts
Содержит интерфейсы:
HttpClientInterface
TransportInterface
ResponseInterface
HttpClientInterface определяет публичные HTTP-методы клиента:
get() post() put() patch() delete()
TransportInterface определяет механизм выполнения HTTP-запроса.
ResponseInterface определяет интерфейс HTTP-ответа.
Services
HttpClientService содержит логику HTTP-клиента.
Он определяет HTTP-метод и передаёт данные в TransportInterface.
Например:
HttpClientService::get()
↓
TransportInterface::send('GET', ...)
Transport
CurlTransport реализует TransportInterface и отвечает непосредственно за работу с PHP cURL.
Он:
- формирует URL с query parameters;
- устанавливает HTTP headers;
- устанавливает HTTP method;
- сериализует body в JSON;
- выполняет cURL-запрос;
- получает HTTP status code;
- получает response headers;
- получает response body;
- выбрасывает
ConnectionExceptionпри ошибке cURL.
Http
Содержит объект HTTP-ответа:
Response
Facades
Содержит:
Http
Facade предоставляет единый публичный интерфейс для работы с HTTP-клиентом.
Exceptions
Содержит исключения:
ConnectionException
HttpException
Структура проекта
src/
├── Contracts/
│ ├── HttpClientInterface.php
│ ├── ResponseInterface.php
│ └── TransportInterface.php
│
├── Exceptions/
│ ├── ConnectionException.php
│ └── HttpException.php
│
├── Facades/
│ └── Http.php
│
├── Http/
│ └── Response.php
│
├── Services/
│ └── HttpClientService.php
│
└── Transport/
└── CurlTransport.php
Дизайн
HTTP-клиент не зависит непосредственно от CurlTransport.
Зависимость построена через:
TransportInterface
Благодаря этому transport можно заменить другой реализацией:
TransportInterface
│
└── CurlTransport
Это позволяет в дальнейшем добавлять новые реализации transport без изменения основной логики клиента.
Текущие ограничения
Версия 0.1.0 является первой версией проекта.
В текущей версии:
- используется PHP cURL;
- request body отправляется в JSON;
Content-Type: application/jsonпередаётся пользователем;- GET и DELETE используют query parameters;
- POST, PUT и PATCH используют JSON body;
- HTTP
4xx/5xxвозвращаются какResponse; ConnectionExceptionиспользуется для ошибок cURL;HttpExceptionпока не выбрасывается автоматически;- поддерживается один основной transport —
CurlTransport.
План развития
Развитие проекта:
- возможность задавать настройки пользователем;
- вынести конфигурацию из класса Config в JSON-файл;
- улучшение обработки JSON;
- расширенная обработка HTTP-ошибок;
- расширенная работа с HTTP headers;
- корректное формирование URL и query parameters;
- redirect;
- retry;
- PHPUnit-тесты;
- PHPStan;
- middleware;
- logging;
- дополнительные transport;
- поддержка PSR.
- поддержка различных форматов тела запроса;
Лицензия
Пакет распространяется под лицензией MIT.
Автор
Литвиненко Роман Александрович
- GitHub: alf07
- Email: roma.alf89@gmail.com
- Telegram: @Alf88
- Канал в Макс https://max.ru/channel_alf_dev