[英]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
注释上的produces
和consumes
属性,但没有运气。 我发现的其他答案使用全局配置或与HttpResponse
。 如果可能的话,我想对注释使用更具声明性的方法。
谢谢!
听起来您需要实现一个 REST 端点,其工作方式如下:
在第一次请求时,将启动后台作业以生成报告。
返回 JSON 响应,指示已请求生成报告。
如果后台作业尚未完成,后续请求将返回 JSON 响应,指示正在生成报告。 如果可能,可以在响应中包含一个进度指示器(例如25%
)。
如果后台作业失败,后续请求将返回 JSON 响应,指示失败的原因。
否则,后续请求将返回生成的报告,并带有适当Content-Type
。
现在重要的部分:所有请求必须包括Accept
header列出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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.