aik27 / drom-client
Drom 客户端是一个用于考试的 PHP HTTP 客户端库
v1.0.6
2021-11-06 15:12 UTC
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-09-07 07:32:22 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.cn/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 个测试,覆盖了各种配置、验证场景和请求。