Search by

alf89 / http-client

alf07

Легковесный HTTP-клиент для PHP

0.2.0 2026-09-21 09:28 UTC

This package is auto-updated.

Last update: 2026-09-21 09:29:49 UTC


README

http_client

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.

Автор

Литвиненко Роман Александрович