忽略在 Spring REST WS 中接受 header

Ignore accept header in Spring REST WS

我有这样的东西:

@RestController
public class MyController {

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

}

此 Web 服务根据 Accept header 请求生成报告文件(pdf、xls、csv...)。由于生成是异步执行的,因此最初返回的响应实际上是 JSON ,稍后可以访问报告。

我的问题是,当我调用这个传递一个 Accept header 就像 application/pdf 我收到一个 406 返回,因为 WS 用 JSON 回复。有什么办法可以强制 JSON 回复任何 Accept header 我只收到这个特定映射?

我试过在 GetMapping 注释上使用 producesconsumes 属性,但没有成功。我发现的其他答案使用全局配置或与 HttpResponse 混淆。如果可能的话,我想使用带有注释的更具声明性的方法。

谢谢!

听起来您需要按如下方式实现单个 REST 端点:

  • 在第一次请求时,启动后台作业以生成报告。
    JSON 响应已 returned 表示已请求生成报告。

  • 如果后台作业尚未完成,后续请求将 return 一个 JSON 响应,指示正在生成报告。如果可能,可以在响应中包含进度指示器(例如 25%)。

  • 如果后台作业失败,后续请求将return一个JSON响应指示失败原因。

  • 否则,后续请求将return生成的报告,并带有适当的Content-Type

现在是重要部分:所有请求必须包括Acceptheader列表两者application/json 一种或多种支持的报告格式(例如application/pdftext/csv),否则406 Not Acceptable是returned。

质量值 (;q=) 可用于指示报告格式的偏好。


由于不同的客户端可能需要不同格式的相同报告,因此服务器应支持生成多个报告文件。

例如如果收到 Accept: application/pdf, application/json;q=0.1 的请求,系统将开始生成 PDF。如果使用 Accept: text/csv, application/json;q=0.1 收到另一个请求,系统将开始并行或排队生成 CSV 文件。

后续请求将忽略 pending/completed 不可接受的报告。例如如果收到第三个请求 Accept: text/csv;q=0.5, application/pdf, application/json;q=0.1,系统将开始生成 CSV 文件,系统将 return 生成 PDF 的状态响应,如果完成则下载 PDF。