Обработка неверных PathVariables в Spring Boot - PullRequest
0 голосов
/ 28 февраля 2020

Предположим, у меня есть GET-контроллер / api / product / {id}, где id - это целое число. Каков наилучший способ обработки запросов с нецелыми идентификаторами? В настоящий момент Spring просто создает исключение java .lang.NumberFormatException и возвращает 400.

Ответы [ 3 ]

0 голосов
/ 28 февраля 2020

Ответ 400 кажется уместным, учитывая ваше утверждение, что id является целым числом.

Если вы возражаете против того, чтобы Spring его обработал, вы всегда можете сделать переменную пути строкой, проверьте число самостоятельно. и молча вернуть 400 или любой другой ответ, который вы хотите.

@GetMapping("/api/product/{id}")
public ResponseEntity<Product> getProduct(@PathVariable("id") String s) {
    try {
       int id = Integer.parseInt(s);
       // valid integer id here, do normal work ...
    }
    catch(NumberFormatException nfe) {
       return ResponseEntity.status(400).build(); // or whatever error code you want
    }
}
0 голосов
/ 28 февраля 2020

Предположим, у меня есть контроллер GET / api / product / {id}, где id - это целое число. Каков наилучший способ обработки запросов с нецелыми идентификаторами?

Если /api/product/abcde является ресурсом без текущего представления, то вам, вероятно, следует вернуть 404 Not Found, с объяснением ошибки в теле сообщения.

Коды состояния - это метаданные, целевая аудитория кода состояния - это компоненты общего назначения, которые понимают «передачу документов по сети». " домен. Здесь вы хотите обратить внимание на написание target-uri, и 404 является подходящим способом сделать это.

410 Gone может быть разумной альтернативой 404.

Код состояния 404 не указывает, является ли это отсутствие представительства временным или постоянным; код состояния 410 (пропал) предпочтительнее, чем код 404, если исходный сервер знает, предположительно, через некоторые настраиваемые средства, что условие может быть постоянным.

Ответ 410 в первую очередь предназначен для оказания помощи веб-задаче. обслуживание путем уведомления получателя о том, что ресурс намеренно недоступен и что владельцы серверов желают удалить удаленные ссылки на этот ресурс. Такое событие является обычным для рекламных услуг ограниченного времени и для ресурсов, принадлежащих лицам, которые больше не связаны с сайтом сервера происхождения. Нет необходимости отмечать все постоянно недоступные ресурсы как «пропавшие» или сохранять отметку в течение любого промежутка времени - это оставлено на усмотрение владельца сервера.

Обратите внимание, что оба 404 и 410 «кэшируются по умолчанию», что, вероятно, то, что вам нужно в этом случае.

0 голосов
/ 28 февраля 2020

Вы можете проверять переменную пути, предполагая, что id должен быть положительным значением int.

@GetMapping("/api/product/{id}")
public void getProduct(@PathVariable("id") @Min(value = 0) Integer id) {
    // ...
}

Подробнее о проверке запроса см. Выше здесь .

Вы даже можете попробовать @Range, если знаете, что идентификатор продукта имеет некоторый диапазон значений int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...