Вопрос по java, spring, rest – Как обработать удаление RESTful в Spring MVC
Как правильно использовать RESTful delete в Spring MVC controller? У меня есть DAO, который возвращает логическое значение при попытке удалить какой-либо элемент.
Я пытаюсь удалить элемент. Если все в порядке, просто покажите список элементов (удаленный элемент больше не будет). Если элемент не может быть удален, перенаправьте его на страницу сведений и скажите, почему он не может быть удален.
Мне нужен какой-то особый статус ответа или что-то вроде этого? Является ли мой подход RESTful?
<code>@RequestMapping(value = "items/{id}", method = RequestMethod.DELETE) public String delete(@PathVariable("id") int itemId, Model model) { Item item = itemDao.get(id); // true -> can delete // false -> cannot delete, f.e. is FK reference somewhere boolean wasOk = itemDao.delete(item); if (wasOk) { return "redirect:/items"; } // will write to user which item couldn't be deleted model.addAttribute("item", item); return "items/error"; } </code>
HTTP коды состояния чтобы указать, будет ли операция удаления успешной, а не перенаправления. НапримерHTTP 200 OK
(или жеHTTP 204 No Content
) указать, что операция прошла успешно, иHTTP 404 Not Found
если ресурс, к которому вы пытаетесь получить доступ, не существует,HTTP 405 Method Not Allowed
если операция удаления не разрешена и т. д. На основании состояния ответа клиент может решить, сохранять ли указанный ресурс (в вашем случае объект, на который ссылаетсяitem/{id}
).
Поскольку вы используете Spring, вы можете аннотировать методы вашего контроллера с помощью соответствующих@ResponseStatusнапример,
@ResponseStatus(value = HttpStatus.NO_CONTENT)
Кроме того, веснаHandlerExceptionResolver
уже предоставляет некоторые коды состояниядефолт.
тогда это нормально. Если пользователь ничего не может сделать, возможно, будет более корректным статус кода ошибки. Единственный сбой, который я могу представить для удаления, - это сбой авторизации, который будет 401. Это можно установить, добавив параметр в ваш метод «HttpServletResponse response». Ваш код станет что-то вроде:
@RequestMapping(value = "items/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") int itemId, Model model, HttpServletReponse response) {
Item item = itemDao.get(id);
// true -> can delete
// false -> cannot delete, f.e. is FK reference somewhere
boolean wasOk = itemDao.delete(item);
if (!wasOk) {
// will write to user which item couldn't be deleted
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
model.addAttribute("item", item);
return "items/error";
}
return "redirect:/items";
}
Вы можете заменить другие коды состояния соответствующим образом, но это общая идея.
Вы также можете сделать что-то вроде:
if (!wasOk) {
throw new DataAccessException("Unable to delete item: " + item);
}
И затем есть аннотированный обработчик ошибок в том же классе
@ExceptionHandler(DataAccessException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleDataAccessException(DataAccessException ex) {
// Do some stuff
return "errorView";
}