4

我正在尝试为 OpenAPI 3.0 规范中的响应创建链接。更具体地说,我想提供我的一个响应与其他可用操作之间的已知关系(参见Link Object)。

在我的 Spring Boot 项目中,我使用 Springdoc(版本:1.3.9)来生成我的 API 文档。根据@ApiResponse#links文档,我尝试使用以下端点代码来实现我的目标:

@GetMapping(value = "/avatar", produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "Request avatar info", operationId = "requestAvatar")
@ResponseStatus(HttpStatus.OK)
@ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "OK", links = {
                @Link(name = "Download Avatar", operationId = "downloadAvatar",
                        parameters = {
                                @LinkParameter(name = "userId"),
                                @LinkParameter(name = "uuid")
                        })
                }),
                ...
@ResponseBody
ResponseEntity<Avatar> requestAvatar();

不幸的是,我在 Swagger UI 中看不到任何结果,只有“无链接”描述。

没有链接

检查生成的 JSON 规范后,我也没有找到APIlinks的任何密钥。requestAvatar

在创建过程中我是否遗漏了一些东西,@Link或者 Springdoc 还不支持链接?

4

1 回答 1

6

看起来链接在使用时不起作用@ApiResponses。这可能是一个错误。

当在内部定义响应列表时@Operation,API 规范就会正确生成。

例子:

...
@Operation(summary = "Request avatar info", operationId = "requestAvatar", responses = {
        @ApiResponse(responseCode = "200", description = "OK", links = {
                @Link(name = "Download Avatar", operationId = "downloadAvatar", parameters = {
                        @LinkParameter(name = "userId", expression = "$request.query.userId"),
                        @LinkParameter(name = "uuid", expression = "$request.query.uuid")
                })
        })
})
...

生成的 API 规范:

...
"get": {
    "summary": "Request avatar info",
    "operationId": "requestAvatar",
    "responses": {
        "200": {
            "description": "OK",
            "content": {
                ...
            },
            "links": {
                "Download Avatar": {
                    "operationId": "downloadAvatar",
                    "parameters": {
                        "userId": "$request.query.userId",
                        "uuid": "$request.query.uuid"
                    }
                }
            }
        }
    }
}
...
于 2020-05-25T00:14:34.273 回答