Подтвердить что ты не робот

В JAX RS различия между возвращаемым ответом и Bean или набором Beans (DTO)

Я работаю над созданием REST api. Мой вопрос заключается в том, когда вы используете Джерси, каковы различия между моими службами и возвратом объекта Response или возвратом bean или коллекции. Меня беспокоят только успешные звонки, я выбрасываю соответствующие исключения для ошибок и исключительных ситуаций.

Вот пример:

@Produces(MediaType.APPLICATION_JSON)
public Response search(FooBean foo){
    List<FooBean> results = bar.search(foo);
    return Response.ok(results).build();
}

против.

@Produces(MediaType.APPLICATION_JSON)
public List<FooBean> search(FooBean foo){
    List<FooBean> results = bar.search(foo);
    return results;
}

Я видел оба примера, и я предпочел бы второй сценарий, чтобы упростить распознавание метода службы. Я рассмотрел ответы на оба этих метода, и они кажутся одинаковыми.

Мысли?

4b9b3361

Ответ 1

Различия объясняются в спецификации JAX-RS:

3.3.3 Тип возврата

Способы ресурсов МОГУТ возвращать void, Response, GenericEntity или другой тип Java, эти типы возвращаемых данных отображаются в тело объекта ответа следующим образом:

недействительным
Результаты в пустом теле тела с кодом статуса 204.

ответ
Результаты в сущности, отображаемой из свойства объекта Response с кодом состояния, указанным свойством status Response. Возвращаемое значение null возвращает код состояния 204. Если свойство статуса Response не установлено: код состояния 200 используется для свойства, отличного от null, и код состояния 204 используется, если свойство entity равно null.

GenericEntity
Результаты в теле объекта, отображаемого из свойства Entity GenericEntity. Если возвращаемое значение не является нулевым, используется код состояния 200, возвращаемое значение null возвращает код состояния 204.

Другое
Результаты в сущности, отображаемой из класса возвращаемого экземпляра. Если возвращаемое значение не является нулевым, используется код состояния 200, возвращаемое значение null возвращает код состояния 204.

Методы, которые должны предоставить дополнительные метаданные с ответом, должны возвращать экземпляр Response, класс ResponseBuilder обеспечивает удобный способ создания экземпляра Response с использованием шаблона построителя.

'Regular' beans сопоставляются почти так же, как и Response, за исключением того, что Response позволяет вам устанавливать дополнительные метаданные (заголовки ответов, специализированный статус, тип специализированного контента и т.д.).). Насколько вы можете использовать, это полностью зависит от вас, и решите - Response дает вам большую гибкость, но регулярные beans более "самодокументируются".

Ответ 2

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

Единственное отличие заключается в конкретных сценариях, таких как возврат нулевых объектов или создание объекта, как этот пример:

@POST
@Consumes("application/json")
public Response post(String content) {
    URI createdUri = ...
    Object createdContent = create(content);
    return Response.created(createdUri).entity(createdContent).build();
}

В этом случае возврат будет 201 - CREATED (с URI для доступа к созданному объекту)

Итак, следующий метод:

@POST
@Consumes("application/json")
public Object post(String content) {
    URI createdUri = ...
    Object createdContent = create(content);
    return createdContent;
}

... вернет ответ 200 - OK

Если вам не нужен статус ответа, который получит ваш клиент, вы можете без проблем использовать любые объявления.

Источник: Jersey.

Ответ 3

Мой личный взгляд, если ответ содержит DTO (Bean/Collection of beans), служба отдыха всегда должна возвращать DTO, но не объект Response.

Мотивация: рано или поздно вам будет предложено облегчить использование службы отдыха для клиентов, предоставив клиент отдыха api. Обычно для этого нужно извлечь интерфейсы для отдыха и реализовать их с помощью служб отдыха. Эти интерфейсы для отдыха используются клиентами вашего клиента для отдыха.

И с клиентской точки зрения существует огромная разница между обработкой DTO и простым ответом. В случае использования Response ваш клиент принудительно:

  • Проверить код ответа, чтобы обработать успешный ответ
  • Обработать ошибки, явно проверяя коды.
  • Преобразуйте тело своего ответа в DTO самостоятельно.

Это означает, что обработка Response очень похожа на возврат кодов ошибок в методах, что считается очень плохой практикой. Чтобы обрабатывать ошибки в одном месте, используются исключения (я не говорю о способах обработки ошибок FP, что является лучшим).

Итак, что вы можете сделать:

  • Если запрос успешно обработан, преобразуйте в данные службы отдыха в DTO/ Bean и верните его.
  • Если проверка не удалась или что-то пошло не так, отправьте исключение в службу отдыха. Возможно, для вас не подходит конструктор исключений по умолчанию , поэтому вам придется реализовать свой собственный сборщик исключений.

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

Один прецедент, когда должен быть возвращен простой ответ - когда вы экспортируете файл, например. Кажется, JAX RS не позволяет возвращать объект InputStream. Не уверен, его нужно проверить.

Другой вариант использования, был указан @Perception, но это скорее исключение, чем правило:

Методы, которые должны предоставлять дополнительные метаданные с ответом должен возвращать экземпляр Response, класс ResponseBuilder обеспечивает удобный способ создания экземпляра Response с использованием шаблон строителя.

Примечание: это общий вопрос для JAX RS, не зависит от точной реализации, например Resteasy или Jersey