aik27/drom-client
Composer 安装命令:
composer require aik27/drom-client
包简介
Drom client is a PHP HTTP client library for exam
README 文档
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 тестов покрывающие различные варианты конфигурации, сценарии валидации и запросы.
aik27/drom-client 适用场景与选型建议
aik27/drom-client 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 6 次下载、GitHub Stars 达 0, 最近一次更新时间为 2021 年 11 月 05 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 aik27/drom-client 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 aik27/drom-client 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 6
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 2
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2021-11-05