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

Как вызывать код статуса 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.

Может кто-нибудь, пожалуйста, помогите мне здесь? что мне не хватает?

4b9b3361

Ответ 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. Вы исключаете исключения, только если это исключительный случай в вашем приложении и выбрасывание исключения делает это ясно.