Как бы вы справились с REST API только с необязательными параметрами запроса в Spring Boot? - PullRequest
1 голос
/ 20 февраля 2020

Я хочу создать простую конечную точку, которая возвращает объект Order, где я могу искать этот заказ по одному параметру запроса или по комбинации нескольких параметров запроса в целом. Все эти параметры запроса являются необязательными, и причина в том, что разные люди будут получать доступ к этим заказам на основе разных идентификаторов.

Так, например: /order/items?itemId={itemId}&orderId={orderId}&deliveryId={deliveryId}&packetId={packetId}

@GetMapping(path = "/order/items", produces = "application/json")
public Order getOrders(@RequestParam Optional<String> itemId,
                              @RequestParam Optional<String> orderId,
                              @RequestParam Optional<String> deliveryId,
                              @RequestParam Optional<String> packetId) { }

Конечно, я мог бы также пропустить Java Необязательно и использовать @RequestParam(required = false), но вопрос здесь заключается скорее в том, как мне избежать if-else или .isPresent() кошмарная проверка проверки, равны ли параметры запроса нулю? Или есть элегантный способ, в зависимости от комбинации параметров, перейти к моему сервису и репозиторию Spring Data JPA.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Чтобы минимизировать количество параметров в вашем методе, вы можете определить параметры запроса как поля класса:

@Data
public class SearchOrderCriteria {
    private String itemId;
    private String orderId;
    private String deliveryId;
    private String packetId;
}

Затем получить экземпляр такого класса в методе вашего контроллера:

@GetMapping(path = "/order/items", produces = "application/json")
public ResponseEntity<OrderInfo> getOrder(SearchOrderCriteria searchCriteria) {
    OrderInfo order = orderService.findOrder(searchCriteria)
    return ResponseEntity.ok(order);
}

И, к вашим услугам, чтобы избежать кучки if - else, вы можете использовать запрос на примере :

public OrderInfo findOrder(SearchOrderCriteria searchCriteria) {

    OrderInfo order = new OrderInfo();
    order.setItemId(searchCriteria.getItemId());
    order.setOrderId(searchCriteria.getOrderId());
    order.setDeliveryId(searchCriteria.getDeliveryId());
    order.setPacketId(searchCriteria.getPacketId());

    Example<OrderInfo> example = Example.of(order);
    return orderRepository.findOne(example);
}
1 голос
/ 20 февраля 2020

Мое небольшое предложение - избегать использования слишком общего API, например, вы можете разбить свое отображение на несколько конечных точек, например: / order / delivery / itemId / {itemId} и / order / delivery / deliveryId / {deliveryId} и / order / delivery / packetId / {packetId} и обработчик, который вам нужно вызвать на стороне клиента.

...