Swagger servers url 추가하기, https 추가

YulHee Kim·2021년 10월 13일
6
post-thumbnail
post-custom-banner

Spring Boot REST API Documentation인 Swagger
사이드 프로젝트에선 springfox 라이브러리를 사용했다.

서버에서 https로 매핑한 뒤에도 swagger에서 request url이 자꾸 http로 보내져 에러가 났다.
포스트맨에선 보내지지만 swagger에서도 잘 보내져야 프론트 분들이 편할 거 같아 삽질 끝에 알아냈다 😂

문제점

일단 기존 문제는 우리 서버의 url은 https://example.com이지만
swagger의 request url은 http://example.com 이라서 문제가 났던것.

원인 파악

Servers 부분을 보면 url이 계속 http으로 scheme이 적용이 안된다..
yml 방식 Docket에 있는 함수들을 여러 찾아 본 결과
이 글들을 보고 감이 잡힌 것 같다. 한번씩 봐주시기 바란다 ~_~
https://github.com/springfox/springfox/issues/3483
https://idratherbewriting.com/learnapidoc/pubapis_openapi_step3_servers_object.html

server object

severs object sample

servers:
- url: https://api.openweathermap.org/data/2.5/
  description: Production server
- url: http://beta.api.openweathermap.org/data/2.5/
  description: Beta server
- url: http://some-other.api.openweathermap.org/data/2.5/
  description: Some other server

Servers에서 url List를 만들어주면 조작이 가능한것 같다.
이제 해결한 코드들을 보겠다.

해결

1. dependency

implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0'

2. SwaggerConfig

@Configuration
@EnableOpenApi
public class SwaggerConfig {

    @Bean
    public Docket commonApi() {
        Server serverLocal = new Server("local", "http://localhost:8080", "for local usages", Collections.emptyList(), Collections.emptyList());
        Server testServer = new Server("test", "https://서버주소", "for testing", Collections.emptyList(), Collections.emptyList());
        return new Docket(DocumentationType.OAS_30)
                .servers(serverLocal, testServer)
                .groupName("api")
                .apiInfo(this.apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.api"))
                .paths(PathSelectors.ant("/api/**"))
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("api info")
                .description("API")
                .version("1.0.0")
                .build();
    }

}

3. Workaround

@Component
public class Workaround implements WebMvcOpenApiTransformationFilter {

    @Override
    public OpenAPI transform(OpenApiTransformationContext<HttpServletRequest> context) {
        OpenAPI openApi = context.getSpecification();
        Server localServer = new Server();
        localServer.setDescription("local");
        localServer.setUrl("http://localhost:8080");

        Server testServer = new Server();
        testServer.setDescription("test");
        testServer.setUrl("https://서버주소");
        openApi.setServers(Arrays.asList(localServer, testServer));
        return openApi;
    }

    @Override
    public boolean supports(DocumentationType documentationType) {
        return documentationType.equals(DocumentationType.OAS_30);
    }
}

Servers를 보면 url list가 잘 뜬다 👏
밑에 api를 try해봐도 request url도 https로 잘 간다!

profile
백엔드 개발자
post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 5월 31일

오 감사합니다. 덕분에 실마리를 찾았네요

답글 달기