我们有一个带有Swagger和docker的Java Spring Boot项目。我们将其部署在入口控制器后面的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上,使用诸如邮递员之类的应用程序,我们必须调用: 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路径。
谢谢!
答案 0 :(得分:1)
问题在于如何获取swagger的基本路径以匹配代理后面正在使用的路径。根据{{3}}
有不止一种解决方案由于您有一个特定的主机,因此建议您与该主机一起根据请求所要访问的主机更改swagger知道的基本路径。这样,您可以为本地主机和远程主机进行不同的设置。您需要在Swagger @Configuration类的自定义记录部分中为主机设置一个RelativePathProvider,例如https://github.com/springfox/springfox/issues/1443