Это правильный способ вернуть 204 No Content с помощью Spring?

Я пытаюсь удалить статус http NO_CONTENT для ресурса с помощью Weblogic, и ответ занимает 30 секунд. Я неправильно использую Spring или есть ошибка в Weblogic?

Я пробовал это на Weblogic 12.2.1.0.0, используя Spring 5.0.12. Запрос выполнен, ресурс удален, но после этого клиент ждет 30 секунд (браузер TTFB). Это похоже на тайм-аут.

В качестве обходного пути мы можем вернуть http-статус OK.

@DeleteMapping(value = "/{id}")
public ResponseEntity<Void> delete(@PathVariable("id") Long id) {
    useCase.remove(id);
    return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

Я ожидал, что клиент немедленно получит ответ, но он ждет 30 секунд.


person Eduardo Guimaraes    schedule 15.04.2019    source источник
comment
Это также занимает 30 секунд, когда вы вместо этого возвращаете OK?   -  person jhamon    schedule 15.04.2019
comment
Более быстрый способ вернуть ошибку 404 — return ResponseEntity.noContent().build(); . Но то, что вы делаете, правильно с точки зрения получения ответа 404.   -  person Jordan    schedule 15.04.2019
comment
@jhamon Нет. Когда я возвращаю OK, он сразу же отвечает.   -  person Eduardo Guimaraes    schedule 15.04.2019
comment
Можете ли вы показать заголовки ответов, которые вы получаете как для ответов 200, так и для ответов 204? Использовали ли вы @RequestMapping с produces на уровне @Controller, чтобы задать формат тела ответа по умолчанию?   -  person Karol Dowbecki    schedule 15.04.2019
comment
Тьфу, я имел в виду 204 выше, а теперь уже поздно редактировать свой комментарий. Но .noContent() является правильным методом для получения правильного ResponseEntity.   -  person Jordan    schedule 15.04.2019
comment
@Карол Доубеки. Я использовал @RequestMapping без создания. Заголовки ответов: ``` HTTP/1.1 200 OK Дата: понедельник, 15 апреля 2019 г., 17:25:03 по Гринвичу Сервер: Apache Content-Length: 0 Keep-Alive: timeout=15, max=80 Соединение: Keep-Alive `` ` ``` HTTP/1.1 204 Нет содержимого Дата: Пн, 15 апреля 2019 г. 18:26:31 GMT Сервер: Apache Keep-Alive: timeout=15, max=80 Соединение: Keep-Alive ```   -  person Eduardo Guimaraes    schedule 15.04.2019
comment
@Jordan Мне понравился беглый способ, и я изменю код.   -  person Eduardo Guimaraes    schedule 15.04.2019


Ответы (3)


По сравнению с ответом 200, ваш ответ 204 не имеет Content-Length заголовок. Попробуйте добавить его вручную, чтобы увидеть, поможет ли это вашему серверу приложений обрабатывать пустое тело ответа:

return ResponseEntity.noContent().header("Content-Length", "0").build();
person Karol Dowbecki    schedule 15.04.2019

Вы также можете использовать аннотацию @ResponseStatus.

@DeleteMapping(value = "/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public ResponseEntity<Void> delete(@PathVariable("id") Long id) {}
person dehasi    schedule 15.04.2019

Это известная ошибка OHS. https://support.oracle.com/knowledge/Middleware/2162306_1.html

Поведение ошибки: плагин продолжает ждать тела контента, а 204 не имеет тела, в конце концов он запускает тайм-аут чтения (это 30+ секунд).

Вам необходимо загрузить исправление и применить его к OHS или изменить HTTP-код как обходной путь, возможно, 202 (принято).

person devwebcl    schedule 16.04.2019
comment
Спасибо! Я покажу это команде инфраструктуры. - person Eduardo Guimaraes; 18.04.2019
comment
Этот патч применяется к версии 12.1.3.0.0 и выше. 12.2.1.0.0 — текущая версия. Так что этот патч уже был применен. Мы проверили это. Возможно, сервер Apache делает то же самое. - person Eduardo Guimaraes; 26.04.2019