aik27/drom-client

Drom 客户端是一个用于考试的 PHP HTTP 客户端库

v1.0.6 2021-11-06 15:12 UTC

This package is auto-updated.

Last update: 2024-09-07 07:32:22 UTC


README

条件

需要实现一个用于抽象(虚构)评论服务 "example.com" 的客户端。

项目应该表示一个或多个类,这些类将向服务器发出 HTTP 请求。输出应该是一个库,可以将其通过 composer 连接到任何其他项目。

此服务有 3 个方法

comment 对象包含以下字段

  • id - 类型 int。添加时无需指定。
  • name - 类型 string。
  • text - 类型 string。

编写 phpunit 测试,用于检查客户端的可用性。不需要编写 example.com 服务器的代码!只需编写用于操作它的库。

解决方案

客户端从头开始编写,已格式化为库,并发布到 Packagist:https://packagist.org.cn/packages/aik27/drom-client

在分析条件时,决定稍微复杂化它。具体来说,使客户端更加灵活和通用,而不是仅限于与评论和列出的地址一起工作。

为此,实现了以下功能

  • 通过 Config 类的实例创建不同的客户端配置,可以通过更改目标地址和上下文应用来切换。
  • 通过 Scenario 类的实例创建不同的数据验证场景,在将数据发送到服务器之前。
  • 使用可互换的适配器来处理不同的 HTTP 库(GuzzleClientSymfonyClient),并且可以基于通用接口创建自己的适配器。
  • 使用可互换的响应验证器(JsonValidatorXmlValidator)并且可以基于通用接口创建自己的验证器。

安装

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 个测试,覆盖了各种配置、验证场景和请求。