如何记录生成文件 (pdf) 以在 Swagger 上下载的 API?
Posted
技术标签:
【中文标题】如何记录生成文件 (pdf) 以在 Swagger 上下载的 API?【英文标题】:How document an API that produces a file (pdf) for download on Swagger? 【发布时间】:2018-07-10 19:07:15 【问题描述】:我正在尝试寻找某种方法来记录返回 PDF(或任何其他文件)以供下载的 API。
使用Spring,我的Rest资源是这样的:
@Override
@GetMapping(produces = "application/pdf")
public ResponseEntity<InputStreamResource> find(
@PathVariable long id
)
Result result = service.find(id);
HttpHeaders headers = disableCache();
return ResponseEntity
.ok()
.headers(headers)
.contentLength(result.getSize())
.contentType(MediaType.parseMediaType("application/pdf"))
.body(new InputStreamResource(result.getFileInputStream()));
这非常适合下载文件。但我不知道使用 Swagger 记录响应的良好做法。
实际上,我用 Swagger 注释尝试过:
@ApiOperation(value = "Some description")
@ApiResponses(value =
@ApiResponse(code = 200, message = "Success.")
)
@ResponseStatus(HttpStatus.OK)
@GetMapping(produces = "application/pdf")
ResponseEntity<InputStreamResource> find(
@PathVariable long id
);
但是 Swagger 在 Swagger-ui 上将 InputStreamResource
的内容作为 Json 返回,结果是什么不是。
如何在 Swagger 的响应中表示文件下载?
【问题讨论】:
【参考方案1】:让我们尝试像这样更新您的代码:
-
更新标题:
headers.add("Content-Type", "application/pdf");
headers.add("Content-Disposition", "attachment; filename=report.pdf");
-
使用此注释:
@ApiResponses(value =
@ApiResponse(code = 200, message = "Success.", response = byte.class)
)
-
更新 pom:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.21</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.21</version>
</dependency>
希望对你有帮助。
【讨论】:
【参考方案2】:注释被忽略了,但这对我有用:
TypeResolver typeResolver = new TypeResolver();
new Docket(DocumentationType.OAS_30)
.alternateTypeRules(AlternateTypeRules.newRule(
typeResolver.resolve(ResponseEntity.class, InputStreamResource.class),
typeResolver.resolve(Byte.class),
DIRECT_SUBSTITUTION_RULE_ORDER));
【讨论】:
以上是关于如何记录生成文件 (pdf) 以在 Swagger 上下载的 API?的主要内容,如果未能解决你的问题,请参考以下文章
如何编写自定义排序器以在 UI 中按名称对 springdoc swagger 标签进行排序?
如何将 PSD 文件中的所有图层导出为 PDF 矢量以在 Xcode 6 中使用资产目录