CrptApi - техническое задание, цель которого - создание Java клиента для взаимодействия с API Честного знака. Основная особенность этого клиента заключается в поддержке ограничения количества запросов в единицу времени, обеспечивая тем самым эффективное взаимодействие с API без превышения допустимых лимитов.
- Ограничение запросов: Класс
CrptApiреализует ограничение количества запросов к API в рамках заданного временного интервала. - Thread-Safe: Реализация учитывает многопоточное использование, обеспечивая корректную работу в многопоточной среде.
- Гибкая настройка: Пользователь может задать временной интервал и лимит запросов при создании экземпляра класса.
Клиент использует Semaphore для контроля количества одновременных запросов. При достижении лимита запросов дополнительные запросы блокируются до тех пор, пока не будет доступно новое разрешение для их выполнения.
public class CrptApi {
private final Semaphore requestSemaphore;
private final ScheduledExecutorService scheduler;
public CrptApi(TimeUnit timeUnit, long duration, int requestLimit) {
this.semaphore = new Semaphore(requestLimit);
this.scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(() ->
semaphore.release(requestLimit - semaphore.availablePermits()),
0, duration, timeUnit);
}Для использования CrptApi необходимо создать экземпляр класса с указанием временного интервала и лимита запросов. Например:
CrptApi api = new CrptApi(TimeUnit.MINUTES, 1, 5); // Ограничение 5 запросов в минутуДля отправки документа используйте метод sendDocument, передавая JSON-документ и подпись:
String jsonDocument = "..."; // Ваш JSON-документ
String signature = "..."; // Ваша подпись
api.sendDocument(jsonDocument, signature);- Document: Основной класс для представления документа.
- Description: Класс описания документа.
- Product: Класс продукта в документе.
- Jakarta Bean Validation API
- Jackson для сериализации/десериализации JSON
- Lombok для сокращения бойлерплейт-кода