У меня есть сервисный метод, который выглядит так
public void deleteData(Data data) {
this.dataDao.deleteData(data);
}
В классе данных есть несколько полей. Что-то вроде этого
private String name;
private String category;
private String discriminator;
private String description;
private String appName;
// getters & setters
Мне нужно написать метод отдыха для этого. Я думал написать что-то вроде этого
@DELETE
@Path("/deleteData")
public Response deleteData(Data data) {
// implementation
}
Проблема в том, что использование @DELETE с телом объекта не рекомендуется или широко используется.
Мой вопрос: можно ли использовать @PUT вместо @DELETE? Я не могу изменить реализацию метода службы, так что это не вариант. Какая следующая лучшая альтернатива здесь?
ОБНОВИТЬ
В методе dataDao.deleteData() поиск объекта не осуществляется по идентификатору объекта. Это выглядит примерно так:
DataEntity entity = this.findDataByNameAndAppName(data.getName(), data.getAppName());
Я решил сделать что-то вроде этого:
@DELETE
@Path("/deleteDataset")
public Response deleteDataset(@QueryParam("name") String name,
@QueryParam("appName") String appName) {
// implementation...
}
Однако я не нашел ни одного примера метода @DELETE с @QueryParam. Во всех примерах вместо этого использовалось @PathParam.
Я бы сказал, что использование @DELETE — лучший вариант, поскольку он соответствует спецификации HTTP. Вы можете просто лучше подумать о том, как вы можете интегрировать этот уровень с вашим устаревшим сервисом. Хорошим подходом было бы изменить ваш URI на /delete/{dataId}, а затем правильно обработать его на уровне вашего контроллера (например, создать новый объект Data, устанавливающий идентификатор)
Я обычно использую метод post для этих целей.
Я видел много стандартных клиентов REST, позволяющих пользователям иметь тело запроса для операции DELETE. Поэтому я думаю, что вполне нормально использовать тело запроса для операции DELETE, проверьте этот пост: stackoverflow.com/questions/299628/…
@Amit Jersey, упомянутый в тегах, не разрешает тело для запросов DELETE.




Ну, DELETE предназначен для... удаление материала. Так что придерживайтесь этого (без тела).
Вы можете либо удалить ресурс, используя его уникальный идентификатор, отправленный в качестве параметра пути:
DELETE /resources/{id} HTTP/1.1
Host: example.org
Если вам нужно удалить несколько ресурсов, вы можете рассмотреть параметры запроса для фильтрации набора ресурсов, а затем удалить ресурсы, соответствующие таким критериям:
DELETE /resources?name=foo&category=bar HTTP/1.1
Host: example.org
Интересно, является ли использование @QueryParam таким же нестандартным, как и предоставление тела сущности?
@Yonetmen URI — это идентификатор ресурса, и ничто не мешает вам выполнить запрос DELETE к URI со строкой запроса.
data? Вам не нужно держать свои контроллеры с той же подписью, что и у вашего сервиса, поскольку вы можете получать любую информацию, обертывать, обрабатывать, форматировать, проверять, а затем использовать ее так, как вам нужно.