<< Шпаргалка по валидаторам в Yii2 Сжатие CSS файлов с помощью PHP >>

Выполнить запрос curl к reg.api

reg_ru_api

Привет снова всем), в этой статье хочу написать как можно упростить код чтобы каждый раз не выполнять запрос какую ту систему, было бы хорошо создать  сервис и в нем  универсальную функцию для обрабатывания всех запросов. Разные интеграции типом уникальные  но всегда можно найти что то общее. В этой статье рассмотрим запрос к reg api. И так сначала создадим сервис   RegRu и после этого функцию  execute. Чтобы выполнить запрос к reg api  сначала нужны распределить основные парамтеры ` ( input_format, output_format, lang ,username, password).

        [
            'username'     => 'test',
            'password'     => 'test',
            'inputFormat'  => 'json',
            'outputFormat' => 'json',
            'lang'         => 'ru'
        ]

Подробно можете смотреть в документации  https://www.reg.ru/support/help/api2.

в нашем случае форматы будут json, язык русский и для тестированя надо username и password поставить <<test>>.  

1. RegRu Service

<?php

namespace app\services;

/**
 * Class RegRu
 * @package app\services
 */
class RegRu
{
    /**
     * @var array 
     */
    private $fields;

    /**
     * @var 
     */
    private $endPoint = "https://api.reg.ru/api/regru2/";

    /**
     * RegRu constructor.
     */
    public function __construct()
    {
       $this->fields = config('services.regru');
    }

}

В конструкторе основные параметры для запроса , эти параметры можно положить в конфиге, .еnv  файле или все сам классе `  назначить свойства и собирать в конструкторе. Я буду налажить в конфиге .

2.  функция  execute

 Какие аргументы нам может понадобится.

  • string $command  имя вызова API
  • array  $args     аргументы запроса
  • $method          метод запроса
private function execute(string $command, array $args, $method = 'POST') : bool

Запрос рег апи  можно сделать разными способами через  guzzle http client, curl и т.д  т.п. В этой статье напишем запрос через curl . И так если добавить некоторые проверки то конечный результат этой функции будет такой `

public function execute($command, array $args, $method = 'POST'): bool
    {
        if (count($args)) {
            if ($this->inputFormat == 'json') {
                $this->fields['input_data'] = json_encode($args);
            } else {
                throw new Exception('Unsupported inputFormat');
            }
        }

        $ch = curl_init("$this->endPoint/$command");

        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        switch ($method) {
            case 'POST':
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $this->fields);
                break;

        }

        //proxy server settings
        if (env('PROXY_SERVER')) {
            curl_setopt($ch, CURLOPT_PROXY, env('PROXY_SERVER'));
            curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);
            if (env('PROXY_SERVER_AUTH')) {
                curl_setopt($ch, CURLOPT_PROXYUSERPWD, env('PROXY_SERVER_AUTH'));
            }
        }

        $response = curl_exec($ch);

        if ($this->outputFormat == 'json') {

            $result = json_decode($response, 1);
            // Reset the decoding error
            if ((json_last_error() !== JSON_ERROR_NONE) || $result === null || !is_array($result)) {
                throw new Exception('Can`t decode response.');
            }

            // if result is not success
            if ($result['result'] != 'success') {
                throw new Exception($result['error_text'], $result['error_code'], $result['error_params']);
            }
        } else {
            throw new Exception('Unsupported outputFormat');
        }

        return $result;

    }

Это функция можно еще  улучшить. Как? .  Создать и  сбрасивать  RegruException , добавить logger. timeout ,debug и всякие другие штуки, но это будем оставить на  ваш вкус .

И конце концов как использовать это. Очень просто нужно просто из текущего контроллера инжектить сервис (dependency injection) и вызвать функцию.

3. Пример

class RegRuController extends Controller
{
    /**
     * @var RegRu
     */
    private $service;

    /**
     * RegRuController constructor.
     * @param RegRu $regRu
     */
    public function __construct(RegRu $regRu)
    {
        $this->service = $regRu;
    }

    /**
     * @param $domain string the domain name to register
     * @param $data   array associative array of required registration data
     */
    public function createDomain($domain, $data)
    {
        try {
            $this->service->execute('domain/create', $data);
        } catch (Exception $e) {
            //TODO To be continued
        }

    }
}


14.05.2019 110 Gor Abrahamyan -> web developer : views