Имеется 3 поставщика данных. Они предоставляют информацию об организации из открытых источников. Нам нужно получить Наименование и КПП по имеющемуся ИНН. произвольная функция, принимающая строку ИНН, возвращающая ассоциативный массив или false;
- PHP-класс, см. шаблон в приложении 1;
- библиотека, подключенная через composer, для получения данных со стороннего сервиса. Например, dadata/apiclient (на сайте dadata.ru можно получить тестовый ключ доступа).
- Вместо получения реальных данных достаточно сделать заглушки с использованием sleep(), rand() и их аналогов.
Выбирать поставщиков данных случайно. Если ошибка или ответ > 1 секунды - переходить к следующему случайному поставщику. Затем, когда наберется статистика (от 10 использований для каждого поставщика), изменять логику: начинать со способа, который быстрее всех отвечал (без ошибок) за данные сутки.
Варианты ввода-вывода данных Через REST API
Запустить терминал и выполнить команду
git clone https://github.com/RubyKeeper/rest_api_test.gitпосле переходим в папку проекта
cd rest_api_test запускаем команду докера:
docker-compose up -d --buildили через компонент Sail
./vendor/bin/sail up -d --buildустанавливаем все зависимости (composer уже есть в проекте):
./vendor/bin/sail php composer.phar install or composer install
в браузере проект доступен по адресам localhost и laravel.test (для запуска laravel.test, требуется редактирование /etc/hosts)
это основной контроллер который обрабатывает API запрос по тестовому заданию
Перечислены источники.
$clients = [
RamisClient::class,
WarmsClient::class,
DadataClient::class
];Контроллер обрабатывает запрос роута routes/api.php по адресу:
http://localhost/api/company-data/{инн}/
или
http://laravel.test/api/company-data/{инн}/
проверить можно используя инструмент Phpstorm или с помощью терминала, введя команду:
$ curl -H 'content-type: application/json' -H 'Accept: application/json' -v -X GET http://localhost/api/company-data/{инн}/
app/Services/ClientsService.php
Нам нужно вести статистику, какие из источников успешно и быстро возвращают ответ. Для этого выбрана БД Redis с типом данных сортируемые списки.
public function getClients(array $clientsHttp): array { }Указанный класс выполняет ниже перечисленные задачи:
- получает все источники со статстики у которых больше 10 успешных вызовов
- сравнивает количество источников с количеством в БД (по условию ТЗ)
- если каждый источник уже вызывался по 10 раз, то отдает их отсортированных по количеству успешных вызовов
- иначе отдает список источников, предварительно рандомно перемешивая их, использовав функцию shuffle()
Хочется выделить следующий момент. По условию ТЗ какие то источники могут возвращать пустые значения или не возвращать вовсе или возвращать ответы очень долго. Эту функцию имитирует рандомно следующий кусок кода
// имитация отрицательного ответа или долгого ответа
switch (rand(0,2)) {
case 0:
$response = $item->sendRequest($inn);
break;
case 1;
$response = false;
break;
case 2;
$response = $item->sendRequest($inn);
sleep(1);
break;
}Классы источников находятся здесь:
app/Clients/