Вопрос по java, spring, rest – Как обработать удаление RESTful в Spring MVC

8

Как правильно использовать 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>

Ваш Ответ

2   ответа
19

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уже предоставляет некоторые коды состояниядефолт.

Error: User Rate Limit Exceeded Xorty
Error: User Rate Limit ExceededclientError: User Rate Limit Exceededitems/{id}Error: User Rate Limit Exceeded
10

тогда это нормально. Если пользователь ничего не может сделать, возможно, будет более корректным статус кода ошибки. Единственный сбой, который я могу представить для удаления, - это сбой авторизации, который будет 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";
}
Error: User Rate Limit Exceeded Xorty
Error: User Rate Limit Exceedednew ModelAndView("errorView", "badItem", ex.getItem())Error: User Rate Limit Exceeded

Похожие вопросы