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
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를 만들어주면 조작이 가능한것 같다.
이제 해결한 코드들을 보겠다.
implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0'
@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();
}
}
@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로 잘 간다!
오 감사합니다. 덕분에 실마리를 찾았네요