Как вызывать код статуса HTTP 204 с использованием каркаса джерси в веб-службе RESTful?
Я использую фреймворк для разработки веб-сервиса RESTful. Я бросаю различные коды состояния HTTP с ответом, используя следующий код:
public class RestNoContentException extends WebApplicationException
{
public RestNoContentException(String message)
{
super(Response.status(Status.NO_CONTENT)
.entity(message).type("text/plain")
.build());
}
}
При тестировании веб-службы REST с помощью клиентского приложения Firefox Mozilla он отображает 200 OK
статус вместо 204 NO CONTENT
. Я обрабатываю другие коды состояния так же, как и для кода состояния 204
. Другие коды состояния отображаются правильно на клиентском инструменте отдыха, но когда для отображения кода состояния 204
отображается код состояния 200 OK
.
Может кто-нибудь, пожалуйста, помогите мне здесь? что мне не хватает?
Ответы
Ответ 1
Во-первых, 204 находится в "успешной" категории кодов ответов, поэтому возвращение его в результате исключения - очень и очень странная вещь.
Во-вторых, 204 означает "Нет содержимого", что означает, что ответ не содержит сущности, но вы помещаете его в него. Вероятно, Джерси переключает его на 200 для вас, что в основном идентично 204, за исключением того, что он содержит объект ответа.
Наконец, вы можете получить 204 ответа очень просто с помощью нескольких встроенных методов поведения: void methods и null возвращают значения, которые сопоставляются с ответом 204. В противном случае просто верните Response.status(204).build()
.
Ответ 2
Вы не должны давать сущность, если хотите сбросить 204:
@GET
@Produces(MediaType.TEXT_PLAIN)
public Response test() {
//return Response.status(Status.NO_CONTENT).entity("hello").build(); //this will throw 200
return Response.status(Status.NO_CONTENT).build();
}
Ответ 3
Только одно, чтобы добавить к уже существующим ответам. То, что делает Джерси, - это правильное поведение как для спецификации:
3.3.3 Тип возврата
Способы ресурсов МОГУТ возвращать void, Response, GenericEntity или другой тип Java, эти типы возвращаемых данных отображаются в тело объекта ответа следующим образом:
void Результаты в пустом теле тела с кодом статуса 204.
Ответ Результаты в теле объекта, отображаемого из свойства объекта Response с кодом состояния, указанным свойством status Response. Возвращаемое значение null возвращает код состояния 204. Если свойство статуса Response не задано: код состояния 200 используется для свойства, отличного от null, и код состояния 204 используется, если свойство entity равно null.
GenericEntity Результаты в теле объекта, отображаемого из свойства Entity GenericEntity. Если возвращаемое значение не является нулевым, используется код состояния 200, возвращаемое значение null возвращает код состояния 204.
Другие Результаты в теле объекта, отображаемого из класса возвращаемого экземпляра. Если возвращаемое значение не является нулевым, используется код состояния 200, возвращаемое значение null возвращает код состояния 204.
[...]
И поскольку вы используете исключение, применяется следующий раздел (выделение мое):
3.3.4 Исключения
Метод ресурсов, метод субресурсов или локатор подресурсов может вызывать любые проверенные или непроверенные исключение. Реализация ДОЛЖНА улавливать все исключения и обрабатывать их следующим образом:
- Экземпляры WebApplicationException ДОЛЖНЫ быть отображены в ответ следующим образом. Если свойство ответа исключения не содержит сущности и поставщика отображения исключений (см. раздел 4.4) доступен для WebApplicationException, реализация ДОЛЖНА использовать провайдера для создания нового экземпляра Response, , иначе свойство ответа будет использоваться напрямую. в результате экземпляр Response обрабатывается в соответствии с разделом 3.3.3.
[...]
Итак, вы должны либо вернуть null, void или построить ответ 204. Вы исключаете исключения, только если это исключительный случай в вашем приложении и выбрасывание исключения делает это ясно.