当前位置: 首页 > 知识库问答 >
问题:

使用Springfox在Swagger UI留档中添加标头参数

罗建弼
2023-03-14

我想在我的 rest 服务的自动生成的 swagger ui 文档中添加一个标头参数字段。我使用Spring和Spring狐。

public ResponseEntity<User> saveNewUser(
        @ApiParam(value = "the user to create", required = true) @RequestBody User user) throws RestServiceException {

    userService.save(user);
    return new ResponseEntity<User>(user, HttpStatus.OK);
}

如您所见,我已经有一个体型参数。我只想添加一个标题类型。

共有3个答案

郎伟兆
2023-03-14

如果你有更多的标头参数,那么每个API都会有那么多@Request estHeader

为了避免这种情况,并且您的API看起来很简单,您可以使用HeaderInterceptor来捕获头信息。

In preHandle() ,  you need to extract the headerInfo in to a an Object and set it as RequestAttribute

  public class MyHeaderInterceptor extends HandlerInterceptorAdapter {

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception { 

    HeaderVo headerVo = HeaderVo.createReqHeaderinput(
            request.getHeader("authorization"),
            request.getHeader("contentType"),                
            request.getHeader("myHeaderParam0"),
            request.getHeader("myHeaderParam1"), 
            request.getHeader("myHeaderParam3"),
            request.getHeader("myHeaderParam4"),
            request.getHeader("myHeaderParam5")

            );

     // You can do any validation of any headerInfo here.
     validateHeader(headerVo);

     request.setAttribute("headerName", headerVo);
     return true;
   }

 }

您的API将如下所示,带有@RequestAttribute("headerName ")

public @ResponseBody
ResponseEntity<MyResponse> getSomeApi(
        //Headers common for all the API's       

        @RequestAttribute("headerName") HeaderVo header ,
        @ApiParam(value = "otherAPiParam", required = true, defaultValue = "") 
        @PathVariable(value = "otherAPiParam") String otherAPiParam,
        @ApiParam(value = "otherAPiParam1", required = true, defaultValue = "") 
        @RequestParam(value = "otherAPiParam1") String otherAPiParam1,
        @ApiParam(value = "otherAPiParam2, required = true, defaultValue = "")
        @RequestParam(value = "otherAPiParam2") String otherAPiParam2
     ) throws MyExcp  {
  ....
 }

您的Swagger仍然应该描述API的所有头,因为您可以在Swagger Docket SwaggerConfig Please note ignoredParameterTypes中添加参数,我们提到忽略HeaderVo,因为这是应用程序内部的。昂首阔步并不需要证明

@Bean
public Docket postsApi() {

    //Adding Header
    ParameterBuilder aParameterBuilder = new ParameterBuilder();
    List<Parameter> aParameters = new ArrayList<Parameter>();

    aParameters.clear();

    aParameterBuilder.name("myHeaderParam0").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
    aParameters.add(aParameterBuilder.build());
    aParameterBuilder.name("myHeaderParam1").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
    aParameters.add(aParameterBuilder.build());
   ....
   ....

    return new Docket(DocumentationType.SWAGGER_2).groupName("public-api")
            .apiInfo(apiInfo()).select().paths(postPaths()).build().ignoredParameterTypes(HeaderVo.class).globalOperationParameters(aParameters);

   }
朱明知
2023-03-14

我刚刚添加了< code > @ request header(value = " my header ")String header str :

public ResponseEntity<User> saveNewUser(
        @RequestHeader(value="myHeader") String headerStr,
        @ApiParam(value = "the user to create", required = true) @RequestBody User user) throws RestServiceException {

    userService.save(user);
    return new ResponseEntity<User>(user, HttpStatus.OK);
}

import org.springframework.web.bind.annotation.RequestHeader;

您还可以使用这里描述的解决方案在文档中的每个服务上添加一个全局头:Spring Springfox头参数

顾高翰
2023-03-14

我更喜欢在我的@Request estMap之后使用@ApiInputicParam,而不是作为函数参数,因为通常您可能会在过滤器中处理标头(例如身份验证),并且您不需要该方法中的值。

此外,如果您在方法中需要它们,Swagger auto会为< code>@HeaderParam提供该字段

此样式还改进了当某些调用需要标头而其他调用不需要标头时的可读性和灵活性。

例子

@PostMapping
@ApiImplicitParam(name = "Authorization", value = "Access Token", required = true, allowEmptyValue = false, paramType = "header", dataTypeClass = String::class, example = "Bearer access_token")
fun addJob(jobRequest: Job): ResponseEntity<*>{}

如果您的所有或大多数endpoint都需要标头,我宁愿配置它,如下所示

如果您必须声明多个标头参数,则需要使用@ApiImplicitParams注释:

@PostMapping
@ApiImplicitParams({
  @ApiImplicitParam(name = "Authorization", value = "Access Token", required = true, allowEmptyValue = false, paramType = "header", dataTypeClass = String.class, example = "Bearer access_token"),
  @ApiImplicitParam(name = "X-Custom-Header", value = "A Custom Header", required = true, allowEmptyValue = false, paramType = "header", dataTypeClass = String.class, example = "my header example")
})
fun addJob(jobRequest: Job): ResponseEntity<*>{}
 类似资料:
  • 如上所述,添加一个方法参数后,springfox会将其选中,当我查看swagger ui时,它有一个用于头的字段。这正是我想要的。我可以告诉springfox在一组方法上包含这个头参数,而不必在方法本身上包含参数吗?我们真正要做的是一个servlet过滤器,它使用头,我们希望通过swagger ui轻松设置它。

  • 我正在实现Apiary的其他同事制作的API。io,在Windows应用商店应用程序项目中。 它们显示了我必须实现的方法的示例: 在这个和其他一些方法中,我需要有一个带有我之前获得的令牌的标头。 如何将该授权标头添加到请求中?

  • 我正在使用为应用程序公开的restapi生成Swagger-API文档。 我需要手动添加API的文档,从技术上讲,该API没有REST控制器。如何手动添加到Swagger API文档中?我想从代码开始做一次。

  • Swagger2.0支持可重用参数,如下所述。 如何使用Springfox利用此特性 SpringFox支持这个特性吗?

  • 我试图使用HttpClient将“Accept Encoding”参数添加到我的HTTP头中,如“gzip,deflate”。代码如下所示。但是,我在响应中遇到以下错误,无法添加header参数。响应不包含添加的标题字段 错误:内部服务器错误

  • 问题内容: 我有一个来自oracle的NO.net Web服务,要访问,我需要添加soap标头。如何在Java中添加soap标头? 这有必要吗? 我的肥皂标头是这样的: 问题答案: 我做到了,只需按照本教程进行即可。很有帮助 是来自javadb的副本(因为已关闭) http://informatictips.blogspot.pt/2013/09/using-message-handler-to-