将 Swagger 文档用于 HttpServletRequest
Using Swagger Documentation for HttpServletRequest
我不熟悉 swagger 和使用它的文档。我目前正在尝试使用 swagger 来显示 PATCH 请求的请求正文。之前PATCH方法的参数是更新对象的DTO,这样可以很方便的显示对象的属性(我用的是SpringBoot,用@Schema
就完美了)。但是,现在 PATCH 方法的参数是一个 HttpServletRequest。我不想在 swagger 文档中显示 HttpServletRequest(这似乎是自动发生的),而是想显示 DTO 属性(就像之前所做的那样)。我想知道是否有办法做到这一点?
非常感谢任何建议!
我假设您正在使用 springdoc-openapi 生成 SwaggerUI。
要使用它,您可以使用以下 Maven 依赖项,
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-webmvc-core</artifactId>
<version>1.4.2</version>
</dependency>
从 springdoc-openapi 的 v1.1.25 开始,HttpServletRequest 和 HttpServletResponse 将被添加到忽略的类型列表中。
见下文,
https://github.com/springdoc/springdoc-openapi/issues/57
所以即使我们在controller方法内部添加HttpServletRequest作为参数,也会被忽略,不会在swagger中显示出来
所以回到你的问题,要显示一个class的模型,你可以描述另一个参数连同 HttpServletRequest 如下,
@Operation(summary = "Returns a token", description = "Returns A token API", tags = "tokenGeneration", responses = {
@ApiResponse(description = "Successful Operation", responseCode = "200", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Timeresponse.class))),
@ApiResponse(description = "not found Operation", responseCode = "404") })
@PatchMapping("/getTokenPatchRequest")
public ResponseEntity getTokenpatch(HttpServletRequest request, @RequestBody AuthReq2 req) {
log.info("The HttpServlet request header contains the information : " + request.getHeader("Authorization"));
Auth2的模型class如下,可以描述你的用户名和密码等示例值
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class AuthReq2 {
@Schema(example = "diannamcallister")
private String userName;
@Schema(example = "test")
private String password;
}
最终 swagger 页面如下所示,
当您在授权中输入内容时header,如下,
这可以通过以下代码通过 HTTP servlet 请求访问,
log.info("The HttpServlet request header contains the information : " + request.getHeader("Authorization"));
springboot 应用程序中的日志条目如下所示,
10:40:01.876 INFO OpenApiController.getTokenpatch:163 - The HttpServlet request header contains the information : Whosebug
上述答案无效,因为向该方法添加另一个参数会破坏该方法本身的功能。
有效的解决方案是在控制器中将内容参数添加到 @RequestBody
注释:
@RequestBody(description = "Description.",
content = @Content(schema = @Schema(implementation = ObjectDTO.class)));
How to displaying the HttpServletRequest in the swagger doc?
可以在swagger2的配置中设置,SwaggerConfig.java
new Docket(DocumentationType.SWAGGER_2)
...
.ignoredParameterTypes(HttpSession.class, HttpServletRequest.class, HttpServletResponse.class)
.build();
我不熟悉 swagger 和使用它的文档。我目前正在尝试使用 swagger 来显示 PATCH 请求的请求正文。之前PATCH方法的参数是更新对象的DTO,这样可以很方便的显示对象的属性(我用的是SpringBoot,用@Schema
就完美了)。但是,现在 PATCH 方法的参数是一个 HttpServletRequest。我不想在 swagger 文档中显示 HttpServletRequest(这似乎是自动发生的),而是想显示 DTO 属性(就像之前所做的那样)。我想知道是否有办法做到这一点?
非常感谢任何建议!
我假设您正在使用 springdoc-openapi 生成 SwaggerUI。
要使用它,您可以使用以下 Maven 依赖项,
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-webmvc-core</artifactId>
<version>1.4.2</version>
</dependency>
从 springdoc-openapi 的 v1.1.25 开始,HttpServletRequest 和 HttpServletResponse 将被添加到忽略的类型列表中。
见下文,
https://github.com/springdoc/springdoc-openapi/issues/57
所以即使我们在controller方法内部添加HttpServletRequest作为参数,也会被忽略,不会在swagger中显示出来
所以回到你的问题,要显示一个class的模型,你可以描述另一个参数连同 HttpServletRequest 如下,
@Operation(summary = "Returns a token", description = "Returns A token API", tags = "tokenGeneration", responses = {
@ApiResponse(description = "Successful Operation", responseCode = "200", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Timeresponse.class))),
@ApiResponse(description = "not found Operation", responseCode = "404") })
@PatchMapping("/getTokenPatchRequest")
public ResponseEntity getTokenpatch(HttpServletRequest request, @RequestBody AuthReq2 req) {
log.info("The HttpServlet request header contains the information : " + request.getHeader("Authorization"));
Auth2的模型class如下,可以描述你的用户名和密码等示例值
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class AuthReq2 {
@Schema(example = "diannamcallister")
private String userName;
@Schema(example = "test")
private String password;
}
最终 swagger 页面如下所示,
当您在授权中输入内容时header,如下,
这可以通过以下代码通过 HTTP servlet 请求访问,
log.info("The HttpServlet request header contains the information : " + request.getHeader("Authorization"));
springboot 应用程序中的日志条目如下所示,
10:40:01.876 INFO OpenApiController.getTokenpatch:163 - The HttpServlet request header contains the information : Whosebug
上述答案无效,因为向该方法添加另一个参数会破坏该方法本身的功能。
有效的解决方案是在控制器中将内容参数添加到 @RequestBody
注释:
@RequestBody(description = "Description.",
content = @Content(schema = @Schema(implementation = ObjectDTO.class)));
How to displaying the HttpServletRequest in the swagger doc?
可以在swagger2的配置中设置,SwaggerConfig.java
new Docket(DocumentationType.SWAGGER_2)
...
.ignoredParameterTypes(HttpSession.class, HttpServletRequest.class, HttpServletResponse.class)
.build();