Сопоставление тела запроса HTTP DELETE с параметром метода - PullRequest
0 голосов
/ 23 мая 2019

Я строю REST API, используя JAX-RS. В угловом интерфейсе я отправляю объект, подлежащий удалению, в теле HTTP-запроса (формат JSON). Теперь мне нужен способ отобразить этот запрос HTTP DELETE body, содержащий объект, который необходимо удалить, в локальную переменную в методе REST. Например, в SPRING я сделал это, просто пометив переменную объекта @RequestBody.
Я проверял документы Oracle на javaEE7, но примеры там действительно простые и не включают сложные объекты, а также различные учебники, которые я нашел в другом месте, были на пути простых запросов на удаление, отображающих простой идентификатор с @PathParam.

Может быть, перед этим вопросом, первый вопрос, который я должен задать, - является ли отправка объекта в теле HTTP-запроса вообще хорошим подходом? Я читал некоторые статьи, в которых это обозначалось как не очень хорошая практика, хотя это явно не запрещено. Каковы будут недостатки этого подхода? Я помню, когда я исследовал этот метод в SPRING, я где-то читал, что злонамеренные атаки могут быть возможны с помощью специально созданного пользовательского ввода (я использую постоянную среду JPA, EclipseLink). Возможно, было бы лучше сопоставить первичный ключ с серией @Path переменных, а затем сопоставить их с помощью @PathParam?

Итак, подведем итог, прежде всего, это хороший подход? И как я могу прочитать объект в теле запроса HTTP? Некоторые указатели будут высоко оценены!

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

В отличие от Spring MVC, JAX-RS не определяет аннотации для полезной нагрузки запроса.

Подход JAX-RS немного отличается: значение параметра, не аннотированного какими-либо аннотациями @***Param, отображается из тела объекта запроса.Такой параметр называется параметр сущности .


Первый вопрос, который я должен задать, заключается в том, является ли отправка объекта в теле запроса HTTP хорошим подходом?

Пожалуйста, воздержитесь от этого, так как DELETE не должно работать.

Ниже приведена цитата из RFC 7231 , документа, который в настоящее время определяет семантику и содержимое протокола HTTP / 1.1:

Полезная нагрузка в пределахDELETE сообщение запроса не имеет определенной семантики;отправка тела полезной нагрузки по запросу DELETE может привести к тому, что некоторые существующие реализации отклонят запрос.

Для обеспечения совместимости я советую вам придерживаться стандартов как можно чаще.И вам определенно не нужно отправлять какую-либо полезную нагрузку для идентификации ресурса, который нужно удалить.


Его первичный ключ имеет длину 8 полей.

URI , что означает U универсальный R esource I средство для удаления, предназначено для идентификации ресурса .

Поскольку у вас есть несколько полей, которые совместно определяют ресурс, я советую переосмыслить дизайн вашего приложения.Вы можете, например, ввести какое-то уникальное значение для идентификации ваших ресурсов.Посмотрите на UUID.

1 голос
/ 23 мая 2019

С JAX-RS вам не нужно что-то вроде @ RequestBody.

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

InВ вашем случае передача данных в теле имеет смысл, но как выглядит ваш URL?Как и в случае с REST, у вас должны быть ресурсы, которые можно адресовать по URL

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