aik27 / drom-client
Drom client is a PHP HTTP client library for exam
Requires
- php: >=7.4.0
- guzzlehttp/guzzle: ^7.4
- phpunit/phpunit: ^9.5
- symfony/http-client: ^5.3
This package is auto-updated.
Last update: 2024-11-07 07:48:04 UTC
README
Условие:
Необходимо реализовать клиент для абстрактного (вымышленного) сервиса комментариев "example.com".
Проект должен представлять класс или набор классов, который будет делать http запросы к серверу. На выходе должна получиться библиотека, который можно будет подключить через composer к любому другому проекту.
У этого сервиса есть 3 метода:
- GET http://example.com/comments - возвращает список комментариев
- POST http://example.com/comment - добавить комментарий.
- PUT http://example.com/comment/{id} - по идентификатору комментария обновляет поля, которые были в в запросе
Объект comment содержит поля:
- id - тип int. Не нужно указывать при добавлении.
- name - тип string.
- text - тип string.
Написать phpunit тесты, на которых будет проверяться работоспособность клиента. Сервер example.com писать не надо! Только библиотеку для работы с ним.
Решение задания
Клиент написан с нуля, оформлен в библиотеку и опубликован на Packagist: https://packagist.org/packages/aik27/drom-client
При анализе условий задания было решено немного его усложнить. В частности, сделать так, чтобы клиент был более гибким и универсальным, а не ограничивался работой только с комментариями и перечисленными адресами.
Для этого были реализованы следующие возможности:
- Создание разных конфигураций клиента через экземпляры класса
Config
с возможностью смены целевых адресов и контекста применения. - Создание разных сценариев валидации данных перед отправкой на сервер через экземпляры класса
Scenario
- Использование взаимозаменяемых адаптеров для работы с разными HTTP библиотеками (
GuzzleClient
иSymfonyClient
) и возможность создать собственный на основе общего интерфейса. - Использование взаимозаменяемых валидаторов ответа сервера (
JsonValidator
,XmlValidator
) и возможность создать собственный на основе общего интерфейса.
Установка
composer require aik27/drom-client
Применение
use aik27\DromClient\Client; use aik27\DromClient\Config; use aik27\DromClient\Scenario; use aik27\DromClient\Http\GuzzleClient; use aik27\DromClient\Validators\JsonValidator; try { /* * Конфигурирование клиента под условия тестового задания. */ $config = new Config([ /* * Список целевых адресов. * В данном случае, для сервиса комментариев. */ 'urlGetAll' => 'http://example.com/comments', 'urlCreate' => 'http://example.com/comment', 'urlUpdate' => 'http://example.com/comment/{id}', /* * Внедрение зависимостей. * Для HTTP клиента реализованы взаимозаменяемые адаптеры GuzzleClient() и SymfonyClient() * Для валидации ответа сервера JsonValidator() и XmlValidator() * Использование валидатора ответа не является обязательным. */ 'httpClient' => new GuzzleClient(), 'validator' => new JsonValidator(), /* * Сценарии валидации данных на стороне клиента перед отправкой. * Реализуются через экземпляры класса Scenario. * Использование сценариев не является обязательным. * * Доступные типы параметров валидации: * * type - int|string - проверка типа значения [обязательный] * required - true|false - является ли поле обязательным */ 'scenarioCreate' => new Scenario([ 'name' => [ 'type' => 'string', 'required' => true, ], 'text' => [ 'type' => 'string', 'required' => true, ], ]), 'scenarioUpdate' => new Scenario([ 'id' => [ 'type' => 'int', 'required' => true, ], 'name' => [ 'type' => 'string', 'required' => false, ], 'text' => [ 'type' => 'string', 'required' => false, ], ]), ]); $client = new Client($config); /* * Возвращает список записей путём отправки GET запроса на urlGetAll. * * Метод принимает необязательный аргумент (array) $param * в котором можно перечислить ключ/значения, которые будут переданы в запросе как GET переменные. * Например, параметр сортировки, номер страницы или условие фильтрации данных. */ $client->getAll(); /* * Добавляет запись путём отправки POST запроса на urlCreate. * Принимает обязательный аргумент (object) $data. * Конкретные поля должны быть свойствами объекта. */ $client->create((object)[ 'name' => 'Alexandr', 'text' => 'Hello world', ]); /* * Редактирует запись путём отправки PUT запроса на urlUpdate. * Принимает обязательный аргумент (object) $data. * Конкретные поля должны быть свойствами объекта. * Можно указать только нужные поля. */ $client->update((object)[ 'id' => 42, 'text' => 'New text', ]); } catch (\Exception $e) { echo $e->getMessage(); }
PHPUnit тесты
Написано 26 тестов покрывающие различные варианты конфигурации, сценарии валидации и запросы.