Spring Boot + Zuul: как получить заголовок Content-length из файлового потока, предоставляемого службами RESTful?

Я использую прокси-сервер Spring Cloud и Zuul в качестве шлюза для моей службы RESTful, предоставляемой микрослужбой. Когда я выполняю запрос непосредственно к экземпляру микросервиса, все заголовки предоставляются, как я и ожидал. Однако, когда Zuul передает тот же запрос, заголовок Content-length удаляется. Я провел некоторое исследование по этому поводу и увидел, что Zuul добавляет заголовок «Transfer-Encoding» как «разделенный», и в этом случае заголовок Content-length опущен (Content-Length удаляется, Spring Cloud Netflix: что происходит в ZuulConfiguration с ZuulServlet?).

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

Вот метод в моем микросервисе:

@RequestMapping(value = "/jobresult/{id}", method = RequestMethod.GET)
@Timed
public ResponseEntity<InputStreamResource> downloadJobResult(@PathVariable Long id) {
    Job job = jobService.findOne(id);
    File file = new File(job.getTargetFile());
    try {
       return ResponseEntity.ok().contentLength(file.length()).contentType(MediaType.APPLICATION_OCTET_STREAM).body(new InputStreamResource(new FileInputStream(file)));
    } catch (FileNotFoundException e) {
       log.error(e.getMessage(), e);
    }
}

Например, запрос к /api/jobresult/1 правильно предоставляет заголовок «Content-length», но запрос к /service/api/jobresult/1 (маршрутизируемый Zuul) не показывает этот заголовок, а также изменяет «Transfer -Кодирование» на «фрагментированное».


person Diego Pessoa    schedule 30.12.2016    source источник


Ответы (2)


Фильтр ответов для Zuul из кода Spring Cloud Netflix вызывает проблему.

Решение

Добавьте файл application.properties в свой src/main/resources, если у вас его нет, и добавьте следующую строку:

zuul.set-content-length=true
person Emil    schedule 17.07.2017
comment
как узнать тип содержимого ответа? Я не могу получить это в фильтре zuul - person Krish; 26.03.2019

К сожалению, я не смог найти ответ на эту проблему. Чтобы все заработало, я написал альтернативный заголовок «X-Content-Length», содержащий размер файла.

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

person Diego Pessoa    schedule 11.01.2017