복붙노트

[SPRING] Springfox와 함께 Swagger UI 문서에 헤더 매개 변수 추가

SPRING

Springfox와 함께 Swagger UI 문서에 헤더 매개 변수 추가

나머지 서비스의 자동 생성 된 swagger ui 설명서에 헤더 매개 변수 필드를 추가하고 싶습니다. Spring과 Springfox를 사용합니다.

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);
}

보시다시피 이미 체형 매개 변수가 있습니다. 헤더 유형 하나를 추가하고 싶습니다.

해결법

  1. ==============================

    1.@RequestHeader (value = "myHeader") String headerStr을 추가했습니다.

    @RequestHeader (value = "myHeader") String headerStr을 추가했습니다.

    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 + 헤더 매개 변수

  2. ==============================

    2.필자는 일반적으로 필터에서 헤더를 처리 (예 : 인증) 할 수 있으며 해당 메소드의 값이 필요하지 않기 때문에 함수 매개 변수 대신 @RequestMapping 다음에 @ApiImplicitParam을 사용하는 것이 좋습니다.

    필자는 일반적으로 필터에서 헤더를 처리 (예 : 인증) 할 수 있으며 해당 메소드의 값이 필요하지 않기 때문에 함수 매개 변수 대신 @RequestMapping 다음에 @ApiImplicitParam을 사용하는 것이 좋습니다.

    Swagger auto가 @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<*>{}
    

    엔드 포인트의 전부 또는 대부분에 헤더가 필요한 경우 여기에 표시된대로 구성합니다.

    여러 헤더 매개 변수를 선언해야하는 경우 @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<*>{}
    
  3. ==============================

    3.더 많은 헤더 매개 변수가있는 경우 모든 API에는 많은 @RequestHeader가 있습니다.

    더 많은 헤더 매개 변수가있는 경우 모든 API에는 많은 @RequestHeader가 있습니다.

    이를 피하고 API가 단순 해 보이도록 헤더 인터셉터를 사용하여 헤더 정보를 캡처 할 수 있습니다.

    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는 여전히 swagger Docket, SwaggerConfig에 매개 변수를 추가 할 수 있도록 API의 모든 헤더를 설명해야합니다. 응용 프로그램 내부이기 때문에 HeaderVo를 무시한다고 언급 한 ignoreParameterTypes에 유의하십시오. swagger는 그것을 보여줄 필요가 없습니다.

    @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);
    
       }
    
  4. from https://stackoverflow.com/questions/40801442/add-a-header-parameter-in-swagger-ui-documentation-with-springfox by cc-by-sa and MIT license