Игнорировать заголовок подтверждения в Spring REST WS - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть что-то вроде этого:

@RestController
public class MyController {

    @GetMapping("/myAddress")
    public Response generateReportAsync(...) {
         ...
    }

}

Этот веб-сервис генерирует файл отчета в соответствии с запрошенным заголовком Accept (pdf, xls, csv ...). Поскольку генерация выполняется асинхронно, возвращаемый ответ на самом деле сначала равен JSON, а отчет становится доступным позже.

Моя проблема в том, что когда я вызываю эту передачу, передавая заголовок Accept, такой как application/pdf, я получаю 406 назад, так как WS отвечает JSON. Можно ли каким-либо образом заставить JSON ответить с любым заголовком Accept, который я получу только для этого конкретного c отображения?

Я пытался поиграться с produces и consumes свойства на GetMapping аннотации без везения. Другие ответы, которые я нашел, используют глобальную конфигурацию или путаются с HttpResponse. Если возможно, я бы хотел использовать более декларативный подход с аннотациями.

Спасибо!

1 Ответ

1 голос
/ 21 апреля 2020

Похоже, вам нужно реализовать одну конечную точку REST, работающую следующим образом:

  • При первом запросе запускается фоновое задание для генерации отчета.
    A JSON возвращается ответ, указывающий, что запрос на генерацию отчета был запрошен.

  • Если фоновое задание еще не выполнено, последующий запрос вернет ответ JSON, указывающий на процесс создания отчета. Если возможно, индикатор ответа (например, 25%) может быть включен в ответ.

  • Если фоновое задание не выполнено, последующие запросы будут возвращать ответ JSON, указывающий на причину сбоя.

  • В противном случае последующие запросы будут возвращать сгенерированный отчет с соответствующими Content-Type.

Теперь для важной части: Все запросы должны включать Accept список заголовков оба application/json и один или несколько поддерживаемых форматов отчетов (например, application/pdf, text/csv), в противном случае 406 Not Acceptable

Значения качества (;q=) могут использоваться для указания предпочтения формата отчета.


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

Например, если запрос получен с Accept: application/pdf, application/json;q=0.1, система начнет генерировать PDF. Если другой запрос получен с Accept: text/csv, application/json;q=0.1, система начнет генерировать файл CSV, параллельно или в очереди.

Последующие запросы будут игнорировать ожидающие / завершенные отчеты, которые не являются приемлемыми. например, если третий запрос получен с Accept: text/csv;q=0.5, application/pdf, application/json;q=0.1, система начнет генерировать файл CSV, система вернет ответ о статусе генерации PDF или загрузит PDF, если он завершен.

...