2015-07-27 5 views
5

Я использую Джерси (1.18) для создания API REST для моего WebApplication. В части моего кода у меня есть следующий фрагмент.Ответ Джерси «NoContent» возвращает 200 вместо 204

return Response.status(Status.NO_CONTENT).entity(err_message).build(); 

, где Status является экземпляром com.sun.jersey.api.client.ClientResponse.Status;

Согласно Джерси документации NO_CONTENT должен возвращать код , вместо этого, ответ HTTP имеет заголовок с кода.

NO_CONTENT
общественности статической окончательный ClientResponse.Status NO_CONTENT
204 No Content см HTTP/1.1 документации.

Я попытался изменить вышеупомянутый код

return Response.noContent().entity(err_message).build(); 

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

Любое предложение «Как я могу вернуть код 204?», Это ошибка, или я делаю что-то неправильно.

Примечание: Не дубликат Returning 200 response code instead of 204

ответ

6

См this SO answer, который говорит,

... 204 означает "No Content", это означает, что ответ не содержит сущности, но вы положили один в Это. Вероятно, Джерси переключает его на 200 для вас, что в основном идентично 204, за исключением того, что он содержит объект ответа.

Наконец, вы можете получить 204 ответа очень просто с помощью нескольких встроенных методов : методы void и значения null возвращают оба значения на карту 204 . В противном случае просто верните Response.status(204).build().

Другими словами, если вы хотите «NO_CONTENT», тогда не включайте контент в свой ответ.

+0

Ударьте меня на минутку! Спасибо за быстрые ответы. Я также заключил то же самое – Athafoud

3

После того, как немного больше копания, я нашел проблему. W3c Documentation дает подсказку.

Я цитирую

10.2.5 204 No Content

Сервер выполнил запрос, но не нужно возвращать тело объекта, и, возможно, захотите вернуться обновленной метаинформации. Ответ МОЖЕТ включать новую или обновленную метаинформацию в виде заголовков-сущностей, которые, если они ДОЛЖНЫ быть связаны с запрошенным вариантом.

Если клиент является пользовательским агентом, ему НЕ ДОЛЖНО изменять вид своего документа, который был вызван отправкой запроса.Этот ответ в первую очередь предназначен для того, чтобы разрешить ввод действий для действий, не вызывая изменения в представлении активного документа пользовательского агента, хотя любая новая или обновленная метаинформация ДОЛЖНА применяться к документу, находящемуся в настоящее время в активном представлении агента пользователя.

Ответ 204 НЕ ДОЛЖЕН включать тело сообщения и поэтому всегда заканчивается первой пустой строкой после полей заголовка.

В моем коде у меня есть entity(err_message), что вызывает проблему. Удалив его, возвращается . Я думаю, что как-то Джерси или «кто-то» отсылает ответ , так как он имеет контент.

Update (02/05/2015)

Это blog post ссылка (отправил ранее сегодня в качестве ответа, а затем удаляется), дает некоторые дополнительные идеи по поводу ситуации. Основываясь на содержании сообщения в блоге, всякий раз, когда в ответе HTTP присутствует какой-либо контент, вызывается следующий метод. Этот метод устанавливает код состояния обратно до 200.

private void commitWrite() throws IOException { 
    if (!isCommitted) { 
     if (getStatus() == 204) 
      setStatus(200); 
       isCommitted = true; 
       o = responseWriter.writeStatusAndHeaders(size, ContainerResponse.this); 
    } 
} 

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

Смежные вопросы