【问题标题】:How to change default swagger.json file path?如何更改默认 swagger.json 文件路径?
【发布时间】:2018-05-19 09:41:53
【问题描述】:

我创建了 Ngnix-Consul Docker 设置,引用 https://github.com/nginxinc/NGINX-Demos/tree/master/consul-template-demo

并创建了许多微服务。因此,只有在添加服务名称后才能访问所有微服务,例如

http://example.com/service_name/get_data

一切正常,然后我想为所有微服务添加招摇,所以尝试使用下面的 sn-p 我可以使用 swagger ui 访问

http://example.com/service_name/ui

但问题是我无法在该 ui 中加载 swagger.json,因为它试图访问以下 url 上的 swagger.json

http://example.com/swagger.json

但是json文件在

http://example.com/service_name/swagger.json    

如何更改 swagger.json 的默认路径?

微服务中的应用程序是在 python-flask 中创建的 我在sn-p下面试过了

swagger: "2.0"
    info:
      description: "Add service"
      version: "1.0.0"
      title: "Add Service"
      contact:
        email: "abc@efg.com"
      license:
        name: "s1.0"
        url: "http://sample.com"
    host: "abc.efg.com"
    tags:
    - name: "add service"
      description: "service"
    - name: "delete service"
      description: "data"
    schemes:
    - "http"
    paths:
      /service_name/get_data:

甚至我也尝试在 swagger.yaml 文件中添加 basePath 然后它甚至没有打开swaggerui

swagger: "2.0"
    info:
      description: "Add service"
      version: "1.0.0"
      title: "Add Service"
      contact:
        email: "abc@efg.com"
      license:
        name: "s1.0"
        url: "http://sample.com"
    host: "abc.efg.com"
    basePath: "service_name"
    tags:
    - name: "add service"
      description: "service"
    - name: "delete service"
      description: "data"
    schemes:
    - "http"
    paths:
      /get_data:

更新:

from flask import Flask
import connexion

app = Flask(__name__)
app = connexion.App(__name__)
app.add_api('swagger.yaml')

//apis

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8090, debug=True)

【问题讨论】:

  • 你为 swagger ui 使用了哪个 python 包?你是怎么设置的?
  • 请检查我更新的问题。 connexion 是包
  • 试试app.add_api('swagger.yaml', base_path='service_name')
  • 我曾尝试在 swagger.yml 中使用 basePath。有了这个其余服务正在工作,但没有 swagger.json 和 ui
  • 不在 yaml 中,而是在 add_api 调用中

标签: nginx swagger swagger-ui swagger-2.0 consul


【解决方案1】:

我自己也有类似的问题。我的解决方案是在 NGINX 级别禁用路径重写,以便微服务接收完整的 url:

之前:

Request: 
http://example.com/service_name/get_data

Service sees:
/get_data

之后:

Request: 
http://example.com/service_name/get_data

Service sees:
/service_name/get_data

只有这样你才能在 swagger.yaml 文件中将 basePath 指定为“service_name”:

swagger: "2.0"
    info:
      description: "Add service"
      version: "1.0.0"
      title: "Add Service"
    host: "abc.efg.com"
    basePath: "service_name"

【讨论】:

    【解决方案2】:

    如果文件 swagger.json 在 NGINX 配置中是静态的,您可以像这样制定别名规则:

    location ^~ /swagger.json {
        alias /path_to/swagger.json;
    }
    

    【讨论】:

    • 不,我不能这样做,因为我有多个微服务,每个都有自己的 swagger.json
    • 可能的问题在这里 github.com/swagger-api/swagger-core/blob/master/modules/… 在 doGet 方法中: if ("/swagger.json".equals(pathInfo)) { response.getWriter().println(Json.mapper().writeValueAsString(昂首阔步)); } else if ("/swagger.yaml".equals(pathInfo)) { response.getWriter().println(Yaml.mapper().writeValueAsString(swagger)); } 其他 { response.setStatus(404); }
    • 我认为要解决这个问题,您可以将每个服务放在自己的子域中,例如 service_name.example.com
    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2010-09-17
    • 2019-12-03
    • 2021-06-19
    • 2015-11-12
    • 1970-01-01
    相关资源
    最近更新 更多