【问题标题】:How document an API that produces a file (pdf) for download on Swagger?如何记录生成文件 (pdf) 以在 Swagger 上下载的 API?
【发布时间】: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 的响应中表示文件下载?

【问题讨论】:

    标签: spring rest api swagger


    【解决方案1】:

    让我们尝试像这样更新您的代码:

    1. 更新标题:
    headers.add("Content-Type", "application/pdf");
    headers.add("Content-Disposition", "attachment; filename=report.pdf");
    
    1. 使用此注释:
    @ApiResponses(value = {
        @ApiResponse(code = 200, message = "Success.", response = byte.class)
    })
    
    1. 更新 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));
      

      【讨论】:

        猜你喜欢
        • 2020-01-20
        • 2021-07-13
        • 2020-07-06
        • 2018-04-18
        • 2011-04-04
        • 2017-06-08
        • 1970-01-01
        • 2019-12-21
        • 2016-05-01
        相关资源
        最近更新 更多