Как построить POST-запрос, который не требует тела - PullRequest
0 голосов
/ 20 ноября 2018

У меня HTTP-клиент, отправляющий множество POST запросов на сервер.Сервер отвечает на все запросы с 201 Created и телом ответа.Для моих целей достаточно заголовка ответа, так как меня интересует только заголовок Location.Я бы хотел избежать того, чтобы сервер выдавал тело ответа для значительного уменьшения сетевого трафика.

Согласно RFC 7231 , ...

  [...] if one or more resources has been created on the origin server as a
  result of successfully processing a POST request, the origin server
  SHOULD send a 201 (Created) response containing a Location header [...]

..., таким образом, я предполагаю, что сервер МОЖЕТ также ответить, например, 204 No Content, опуская тело.

Поэтому мой вопрос: возможно ли построить запрос POST, который заставит сервер ответить 204 No Content, или опустить тело ответа другим способом?

Обновление 1: серверсторона проекта Spring Data REST, и я могу его настроить.Я знаю, что мог бы установить RepositoryRestConfiguration#setReturnBodyOnCreate в false, но это было бы преувеличено, поскольку это затрагивает все входящие запросы.Поэтому я бы предпочел принять решение на стороне клиента.

Ответы [ 4 ]

0 голосов
/ 30 ноября 2018

Основываясь на ответах Эверта и Бертрана, а также немного погуглив, я наконец-то реализовал следующий перехватчик на сервере REST Spring Data:

@Configuration
class RepositoryConfiguration {

    @Bean
    public MappedInterceptor preferReturnMinimalMappedInterceptor() {
        return new MappedInterceptor(new String[]{"/**"}, new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
                if ("return=minimal".equals(request.getHeader("prefer"))) {
                    response.setContentLength(0);
                    response.addHeader("Preference-Applied", "return=minimal"");
                }
                return true;
            }
        });
    }

}

Он выдает следующее сообщение, что достаточно хорошодля моих целей:

> POST /versions HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.59.0
> Accept: */*
> Content-Type: application/json
> Prefer: return=minimal
> Content-Length: 123
>
> [123 bytes data]

...

< HTTP/1.1 201
< Preference-Applied: return=minimal
< ETag: "0"
< Last-Modified: Fri, 30 Nov 2018 12:37:57 GMT
< Location: http://localhost:8080/versions/1
< Content-Type: application/hal+json;charset=UTF-8
< Content-Length: 0
< Date: Fri, 30 Nov 2018 12:37:57 GMT

Я хотел бы разделить награду равномерно, но это невозможно.Это идет к Бертрану, так как он пришел с ответом, который привел меня к самому осуществлению.Спасибо за вашу помощь.

0 голосов
/ 30 ноября 2018

Нет способа сделать это только на стороне клиента, поскольку он не реализован в Spring REST-сервере.

В любом случае, любой запрос клиента может быть преобразован в дополнительный пользовательский заголовок или параметр запроса в запросе..

Может быть способ переопределить обработчики ответов по умолчанию и обнаружить настраиваемый заголовок (например, реализует Prefer: return=minimal, как предлагалось ранее) и / или наличие параметра запроса для запуска пустого ответа с204 статус. Этот пост может помочь вам разобраться.

0 голосов
/ 30 ноября 2018

Можете ли вы попробовать изменить свой клиент так, чтобы вы

  • a) запрашивали у сервера HTTP-запросы HEAD вместо запросов POST
  • b) анализировали заголовки ответа.Тело ответа на запросы HEAD отсутствует, поскольку назначение запросов HEAD очень похоже на ваше требование
  • c) Выполнять необходимые запросы POST только тогда, когда требуется

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

0 голосов
/ 23 ноября 2018

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

Заголовок, которыйсервер может использовать Prefer: return=minimal, но если служба явно не документирует поддержку этого, маловероятно, что это сработает.

На самом деле единственное, что вы можете сделать, это сделать клиентом:

  1. Завершите TCP-соединение, как только вы получите заголовки ответа
  2. Убейте поток HTTP / 2, когда получите заголовки.

Это довольно«радикальная» вещь, но клиенты в некоторых случаях используют этот механизм, и он работает.Однако, если тело ответа POST было несколько маленьким, есть вероятность, что оно не имеет большого значения, потому что ответ, возможно, уже был отправлен.

...