У меня есть несколько методов в моем REST api, которые возвращают пустоту. По умолчанию джерси устанавливает 204 для таких ответов. Я знаю, что если я верну какой-либо ответ на нулевой объект - 200, однако я бы хотел установить код состояния 200 без необходимости изменения этих методов. Как я могу это достичь?return OK (200) вместо NO_CONTENT (204)
ответ
Если вы не возражаете, перекрывая каждый 204 ответ на 200, то вы можете использовать фильтр:
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
@Provider
public class NoContentToOkResposeFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
if (responseContext.getStatus() == 204) {
responseContext.setStatus(200);
}
}
}
UPDATE
Если вы предпочитаете более настраиваемое решение, то вы можете активируйте фильтр с аннотацией и DynamicFeature
.
Аннотация:
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target(METHOD)
@Retention(RUNTIME)
public @interface ResponseStatus {
int value() default 200;
}
Фильтр:
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
public class OverrideResponseStatusFilter implements ContainerResponseFilter {
private final int statusCode;
public OverrideResponseStatusFilter(int statusCode) {
this.statusCode = statusCode;
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
responseContext.setStatus(statusCode);
}
}
DynamicFeature:
import javax.ws.rs.container.DynamicFeature;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.FeatureContext;
import javax.ws.rs.ext.Provider;
@Provider
public class ResponseStatusDynamicFeature implements DynamicFeature {
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
ResponseStatus responseStatus = (ResponseStatus) resourceInfo.getResourceMethod().getAnnotation(ResponseStatus.class);
if (responseStatus != null) {
context.register(new OverrideResponseStatusFilter(responseStatus.value()));
}
}
}
И, наконец, аннотировать метод ресурса с @ResponseStatus(200)
:
@GET
@Path("/nothing")
@ResponseStatus(200)
public void nothing() {
}
Я надеялся на какую-то аннотацию, но фильтр тоже понравился. –
Нет шансов. Ответ на 'void' жестко запрограммирован здесь: https://github.com/jersey/jersey/blob/master/core-server/src/main/java/org/glassfish/jersey/server/model/internal/VoidVoidDispatcherProvider. java # L82 –
О, подождите! Можно активировать фильтр с помощью специальной аннотации. Дайте мне несколько минут, чтобы обновить мой ответ. –
- 1. Ответ Джерси «NoContent» возвращает 200 вместо 204
- 2. Ajax request return 200 OK, но ошибка вместо успеха
- 3. AngularJS $ http return 200 ok, но сбой
- 4. Маршруты единичного тестирования Mocha return 200 ok
- 5. Имейте nginx return a 204 вместо 5xx
- 6. response_with return 200 вместо 422
- 7. Restlet Получение кода состояния HTTP 204 вместо 200
- 8. Почему yandex возвращает 405, когда google return 200 Ok?
- 9. web api return message in response 200 OK
- 10. JQuery AJAX POST call return 200 status OK, но ошибка
- 11. HttpStatusCodeResult (401) возвращает «200 OK»
- 12. Jersey Response.ok() не дает 200 OK
- 13. ОПЦИИ return 204, POST return 200, но данные не вводятся в db
- 14. Нужно ли 200 OK иметь тело ответа?
- 15. JQuery Ajax 200 OK JSON.ParseError
- 16. Twisted giving twisted.web.client.PartialDownloadError: 200 OK
- 17. Ответ на Stripe 200 Ok
- 18. Получение 200 OK вместо 302 Найдено на cURL
- 19. cURL - получение 200 OK вместо 304 в моем браузере
- 20. Magento возвращает статус «200 OK» вместо «404 не найден»
- 21. ASP.NET Custom 404 Возвращение 200 OK Вместо 404 Не найдено
- 22. jQuery status 200 ok error
- 23. HttpWebRequest автоматически отправляет 200 OK?
- 24. RSolr :: Error :: InvalidRubyResponse - 200 OK
- 25. Paypal IPN, возвращающий HTTP/1.1 200 OK
- 26. ASP.Net WebApi Controller должен возвращать 204 вместо null [HttpResponseMessage]
- 27. Запрос на возврат AJAX 200 OK
- 28. ajax не получает ответ сервлета 200 Ok
- 29. FacebookRealtimeUpdateController Override Post и return 'OK'
- 30. Rails delete действие не выполняется и отображает 200 OK
Зачем вам это нужно? 204 является правильным. Если вы используете 200, вы отправляете заголовок Content-Length: 0' и, возможно, заставляете клиента проверять заголовок и (несуществующий) контент. – vtortola
хорошо, мне предъявили такие требования. –