Swagger UI 试试吧!不适用于 Kubernetes ingress
Swagger UI try It! does not work with Kubernetes ingress
我们有一个 Java Spring 带有 Swagger 和 docker 的引导项目。我们将其部署在入口控制器后面的 kubernetes 上。
它在 localhost 中正常工作(使用 postman 和 swagger-ui 尝试按钮)。
一部署就出问题了
休息控制器:
@ApiOperation(value = "Operation",
notes = "it does something<br />")
@RequestMapping(value="/operation", method=RequestMethod.POST)
@ApiResponses({
@ApiResponse(code = 200, message = "OK")
})
@ResponseBody public ResponseEntity<String> operation(@RequestBody BodyThing thing) {
return new ResponseEntity<>("OK", HttpStatus.OK);
} //operation
现在入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: myapp-ingress
namespace: __NAMESPACE__
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- hosts:
- test.host.com
secretName: key-pair
rules:
- host: test.host.com
http:
paths:
- path: /myapp
backend:
serviceName: myapp-service
servicePort: 8080
然后,应用在线部署在K8S上,使用类似postman的应用,我们必须调用:
https://test.host.com/myapp/operation 才能调用 API。没问题。
如果我们在Swagger中输入问题就来了UI传送门:https://test.host.com/myapp/swagger-ui.html
如果我们尝试在 swagger UI 中调用 API,它会尝试调用 https://test.host.com/operation,但失败并显示 404 代码。
Swagger-UI 使端点 URL 具有:host + basepath + operation_path 即:test.host.com + / + operation
它不聚合入口路径。
我们该如何应对?
当然,只有当我们使用入口控制器部署它时才会发生这种情况,因为我们添加了 /myapp 路径。
谢谢!
问题是如何让 swagger 的基本路径与代理后面使用的路径相匹配。根据 https://github.com/springfox/springfox/issues/1443
有不止一种解决方案
由于您有一个特定的主机,我建议您使用该主机根据请求转到的主机更改 swagger 知道的基本路径。这样您就可以为本地主机和远程主机设置不同的设置。您需要在 Swagger @Configuration class 的自定义摘要部分为您的主机设置一个 RelativePathProvider,就像在 https://github.com/springfox/springfox/issues/1443#issuecomment-274540681
中一样
我们有一个 Java Spring 带有 Swagger 和 docker 的引导项目。我们将其部署在入口控制器后面的 kubernetes 上。
它在 localhost 中正常工作(使用 postman 和 swagger-ui 尝试按钮)。 一部署就出问题了
休息控制器:
@ApiOperation(value = "Operation",
notes = "it does something<br />")
@RequestMapping(value="/operation", method=RequestMethod.POST)
@ApiResponses({
@ApiResponse(code = 200, message = "OK")
})
@ResponseBody public ResponseEntity<String> operation(@RequestBody BodyThing thing) {
return new ResponseEntity<>("OK", HttpStatus.OK);
} //operation
现在入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: myapp-ingress
namespace: __NAMESPACE__
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- hosts:
- test.host.com
secretName: key-pair
rules:
- host: test.host.com
http:
paths:
- path: /myapp
backend:
serviceName: myapp-service
servicePort: 8080
然后,应用在线部署在K8S上,使用类似postman的应用,我们必须调用: https://test.host.com/myapp/operation 才能调用 API。没问题。
如果我们在Swagger中输入问题就来了UI传送门:https://test.host.com/myapp/swagger-ui.html
如果我们尝试在 swagger UI 中调用 API,它会尝试调用 https://test.host.com/operation,但失败并显示 404 代码。
Swagger-UI 使端点 URL 具有:host + basepath + operation_path 即:test.host.com + / + operation
它不聚合入口路径。
我们该如何应对? 当然,只有当我们使用入口控制器部署它时才会发生这种情况,因为我们添加了 /myapp 路径。
谢谢!
问题是如何让 swagger 的基本路径与代理后面使用的路径相匹配。根据 https://github.com/springfox/springfox/issues/1443
有不止一种解决方案由于您有一个特定的主机,我建议您使用该主机根据请求转到的主机更改 swagger 知道的基本路径。这样您就可以为本地主机和远程主机设置不同的设置。您需要在 Swagger @Configuration class 的自定义摘要部分为您的主机设置一个 RelativePathProvider,就像在 https://github.com/springfox/springfox/issues/1443#issuecomment-274540681
中一样