如何在Swagger-UI中打开本地文件

92

我想使用swagger-ui在本地计算机上打开自己生成的Swagger规范文件my.json

因此,我下载了最新的标记v2.1.8-M1并解压缩了ZIP文件。然后我进入子文件夹dist并将文件my.json复制到其中。现在我打开了index.html并想要探索my.json。这里问题开始出现:

File in windows explorer Enter path to file in bar Will be prefixed by current url and cannot find the file

如果我输入一个本地路径,它总是会以包含index.html的当前URL为前缀。因此我无法打开我的文件。我尝试了以下所有组合但都没有成功:
  • my.json导致file:///D:/swagger-ui/dist/index.html/my.json
  • file:///D:/swagger-ui/dist/my.json导致file:///D:/swagger-ui/dist/index.html/file:///D:/swagger-ui/dist/my.json

1
实际上,您不需要托管Swagger UI即可查看Swagger规范。我写了一篇文章,解释了如何使用在线可用的petstore Swagger UI来查看您的swagger规范。看看这个链接-https://medium.com/@requestly_ext/check-swagger-api-specs-without-hosting-swagger-ui-934861c004de - Sachin Jain
20个回答

75

我无法让Adam Taras的答案生效(即使用相对路径 ../my.json )。

以下是我的解决方案(如果您安装了Node,则非常快速且无痛苦):

  • 使用Node全局安装http-server软件包npm install -g http-server
  • 更改目录以定位到my.json的位置,并运行命令http-server --cors(必须启用CORS才能工作)
  • 打开Swagger UI(即dist / index.html)
  • 在输入字段中输入http://localhost:8080/my.json,然后单击“Explore”

13
设计太糟糕了。为什么不直接将Swagger UI运行在本地节点服务器上呢? - Kenny Worden
@KennyWorden,因为那样行不通——或许下次可以测试一下?将Swagger UI托管在本地节点服务器上是没问题的,但是如果我输入API的本地路径,例如“file:///path/to/api.json”,UI会自动附加“http://localhost:8080/file:///path/to/api.json”,显然这个路径是无法工作的。我可以将API移动到相同的目录中,键入“my.json”,但是将API复制到Swagger UI位置并不是一个“美观”的解决方案——任何变化都很丑陋。它可能使您感觉更好,但我宁愿拥有可靠工作的较少步骤。 - MandM
1
谢谢。那正是我所缺失的东西。--cors参数。我将其与连接到http-server的docker镜像一起使用,完美地解决了问题。再次感谢。 - Darren
2
这是一个关于HTTP服务器如何工作的速成课程,但我成功地让它全部运行了。谢谢! - Shadoninja
5
建议使用命令http-server --cors -a 127.0.0.1,以防止其他人在网络上浏览您的目录索引。 - Ben Whaley
1
也许对某些人有用,最新的独立Swagger版本下载链接:https://github.com/swagger-api/swagger-ui/releases/latest - Antimo

33

使用spec参数

以下是说明。

创建包含Swagger JSON的spec.js文件

在与index.html(/dist/)相同的目录中创建一个新的javascript文件。

然后插入spec变量声明:

var spec = 

然后将swagger.json文件内容粘贴在后面。它不需要与=符号在同一行。

示例:

var spec =

{
    "swagger": "2.0",
    "info": {
        "title": "I love Tex-Mex API",
        "description": "You can barbecue it, boil it, broil it, bake it, sauté it. Dey's uh, Tex-Mex-kabobs, Tex-Mex creole, Tex-Mex gumbo. Pan fried, deep fried, stir-fried. There's pineapple Tex-Mex, lemon Tex-Mex, coconut Tex-Mex, pepper Tex-Mex, Tex-Mex soup, Tex-Mex stew, Tex-Mex salad, Tex-Mex and potatoes, Tex-Mex burger, Tex-Mex sandwich..",
        "version": "1.0.0"
    },
    ...
    }
}

修改Swagger UI的index.html

这是一个像Ciara一样的两步操作。

包括spec.js文件

修改/dist/index.html文件以包括外部spec.js文件。

 <script src='spec.js' type="text/javascript"></script>

例子:

  <!-- Some basic translations -->
  <!-- <script src='lang/translator.js' type='text/javascript'></script> -->
  <!-- <script src='lang/ru.js' type='text/javascript'></script> -->
  <!-- <script src='lang/en.js' type='text/javascript'></script> -->

  <!-- Original file pauses -->
  <!-- Insert external modified swagger.json -->
  <script src='spec.js' type="text/javascript"></script>
  <!-- Original file resumes -->

  <script type="text/javascript">

    $(function () {
      var url = window.location.search.match(/url=([^&]+)/);
      if (url && url.length > 1) {
        url = decodeURIComponent(url[1]);
      } else {
        url = "http://petstore.swagger.io/v2/swagger.json";
      }

添加spec参数

修改SwaggerUi实例以包括spec参数:

  window.swaggerUi = new SwaggerUi({
    url: url,
    spec: spec,
    dom_id: "swagger-ui-container",

1
这会产生以下错误:已完成加载资源信息。正在呈现Swagger UI... - Ayushi Dalmia
2
这种方法非常有效,而且不需要处理npm,并保留了本地托管 dist/ 文件夹的能力,这是整个过程的关键点。 - syvex
2
仍在2021年1月工作,Swagger版本为3.38.0。 - Emarco
这只适用于JSON规范吗?乍一看似乎不适用于YAML规范。 - Sean Azlin
1
运行得非常好,谢谢。 - DubZ

20

经过一番努力,我找到了一个更好的解决方案。

  1. 创建一个名为swagger的目录

mkdir C:\swagger

如果你使用 Linux 操作系统,请尝试执行以下操作:

    mkdir /opt/swagger
  • 使用以下命令获取Swagger编辑器:

    git clone https://github.com/swagger-api/swagger-editor.git
    
    进入现在创建的swagger-editor目录。
    cd swagger-editor
    
  • 现在可以使用以下命令获取swagger-ui:

    git clone https://github.com/swagger-api/swagger-ui.git
    
  • 现在,复制你的 Swagger 文件,我复制到了以下路径:

    ./swagger-editor/api/swagger/swagger.json
    
  • 所有设置都完成了,使用以下命令运行swagger-edit

  • npm install
    npm run build
    npm start
    
    你将会看到两个URL提示,其中一个可能长这样:
  • You will be prompted 2 URLs, one of them might look like:

    http://127.0.0.1:3001/
    

    上面是Swagger编辑器的网址

  • 现在浏览至:

    http://127.0.0.1:3001/swagger-ui/dist/
    

    以上是Swagger-UI的URL。

    就这些了。

    现在,您可以从swagger-ui或swagger-editor中查看文件。

    安装/构建需要时间,但一旦完成,将会有很好的结果。

    我大约花了两天的时间来解决问题,一次性安装只需约5分钟。

    现在,在右上角,您可以浏览到您的本地文件。

    祝你好运。


  • 1
    谢谢。请注意,由于我们在此场景下运行的是nodejs,因此我们实际上不会从磁盘中读取文件,而是使用URL,例如:http://10.0.60.76:3001/swagger-ui/myfile.json(不要在浏览器的URL中输入此内容,而是在Explore按钮左侧的打开文件中输入,然后单击Explore)。但我想大多数人只想在swagger网站上使用swagger-ui,然后在计算机上打开磁盘文件(这不是一个URL)。 - NealWalters
    2
    http://127.0.0.1:3001/swagger-ui/dist/ 只会给我很多重定向,直到失败。http://127.0.0.1:3001/swagger-ui/dist/index.html 可以使用,然后我需要将 http://127.0.0.1:3001/swagger-ui/dist/api/swagger/swagger.json 粘贴到“探索”字段中并单击“探索”按钮。 - Panu Haaramo

    20
    在包含你想查看的文件./docs/specs/openapi.yml的本地目录中,你可以运行以下命令来启动容器并访问规范:http://127.0.0.1:8246。请注意保留HTML标签。
    docker run -t -i -p 8246:8080 -e SWAGGER_JSON=/var/specs/openapi.yml -v $PWD/docs/specs:/var/specs swaggerapi/swagger-ui
    

    1
    这对我也起作用了。你知道我们如何删除Swagger UI中的顶部栏,以便它不显示Swagger文件的URL位置吗? - Sakib
    2
    针对Windows用户:请将$PWD替换为%cd% - erncyp
    1
    @Sakib,你需要扩展或修改Docker镜像来实现这个功能。在评论中解释起来有点复杂。 - simesy
    @erncyp 当你在PowerShell中时,$PWD也可以在Windows上工作。 - Moritz

    15

    2
    100% 最简单的方法。第一次尝试就成功了! - Eitel Dagnin
    1
    简单快捷。被低估的答案 :p - ChristopheBrun
    对于我们来说,这还不够好,因为我们有各种原因要进行托管。例如,我们需要本地身份验证才能访问文档。 - Spock
    有人知道如何将上述内容与CORS结合起来吗? - Anders
    绝对是个最佳答案。如果我可以多次点赞,我一定会的。 - Michael Krauklis

    11

    如果你只想在swagger UI中查看swagger文档文件(例如swagger.json),可以尝试open-swagger-ui(本质上是在swagger UI中打开)。

    open-swagger-ui ./swagger.json --open
    

    2
    谢谢!如果您只想可视化您的swagger.json文件,那可能是最简单的选择。 - Rayee Roded
    这很好,但是对于basePath来说有问题。 - Benyamin Limanto

    4

    最好的方法是输入相对路径或绝对路径,不需要添加 file:// 协议:

    • ../my.json 导向 file:///D:/swagger-ui/dist/index.html/../my.json 并且可以正常工作。
    • /D:/swagger-ui/dist/my.json 导向 file:///D:/swagger-ui/dist/my.json 并且可以正常工作。

    提示

    这个答案适用于在Win7上使用Firefox。对于Chrome浏览器,请参见下面的评论:


    6
    为了让这个提示有效,需要使用--allow-file-access-from-files参数或--disable-web-security参数启动Chrome。 - Aleksey Korolev
    2
    如何使用户不需要启用--alow-file-access。我将向多个人发送.zip文件。 - Angular

    3

    我曾遇到过这个问题,这里有一个更简单的解决方案:

    • 在您的公共目录中(静态路径:不需要路由),创建一个目录(例如:swagger-ui),将swagger-ui中的dist复制到该目录中,并打开localhost/swagger-ui
    • 您将看到默认的petstore示例的swagger-ui
    • 将dist/index.html中的默认petstore url替换为您的localhost/api-docs或者更通用地替换为:

      location.protocol+'//' + location.hostname+(location.port ? ':' + location.port: '') + "/api-docs";

    • 再次访问localhost/swagger-ui

    瞧!您的本地swagger实现已经准备好了。


    3

    我使用以下 Node.js 工具成功加载了本地的swagger.json规范,整个过程只需要5分钟即可完成:

    swagger-ui-dist

    express

    按照以下步骤操作:

    1. 创建一个文件夹,并将你的swagger.json规范复制到这个新建的文件夹中。
    2. 在同一新建的文件夹中创建一个扩展名为.js的文件,例如我命名为swagger-ui.js,并将以下内容复制并保存到这个swagger-ui.js文件中。
    const express = require('express')
    const pathToSwaggerUi = require('swagger-ui-dist').absolutePath()
    const app = express()
    
    // this is will load swagger ui
    app.use(express.static(pathToSwaggerUi))
    
    // this will serve your swagger.json file using express
    app.use(express.static(`${__dirname}`))
    
    // use port of your choice
    app.listen(5000)
    
    1. 安装依赖项,如npm install expressnpm install swagger-ui-dist
    2. 使用命令node swagger-ui.js运行express应用程序
    3. 打开浏览器并访问http://localhost:5000,这将使用默认URL加载Swagger UI,该URL为https://petstore.swagger.io/v2/swagger.json
    4. 现在使用http://localhost:5000/swagger.json替换上述默认URL,并单击“Explore”按钮,这将从本地JSON文件加载Swagger规范

    您可以根据自己的便利使用文件夹名称、JSON文件名、静态公共文件夹来服务swagger.json,端口号


    3

    这不是一个答案,只是对paragbaxi的回答进行了小更新,请点赞原始答案而不是这个。

    paragbaxi的解决方案在2021年仍然像魅力一样运行。

    以下是最新openapi=3.0.2的完整index.html:

    <!-- HTML for static distribution bundle build -->
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8">
        <title>Swagger UI</title>
        <link rel="stylesheet" type="text/css" href="./swagger-ui.css" />
        <link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32" />
        <link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16" />
        <style>
          html
          {
            box-sizing: border-box;
            overflow: -moz-scrollbars-vertical;
            overflow-y: scroll;
          }
    
          *,
          *:before,
          *:after
          {
            box-sizing: inherit;
          }
    
          body
          {
            margin:0;
            background: #fafafa;
          }
        </style>
      </head>
    
      <body>
        <div id="swagger-ui"></div>
        <script src='spec.js' type="text/javascript"></script>
        <script src="./swagger-ui-bundle.js" charset="UTF-8"> </script>
        <script src="./swagger-ui-standalone-preset.js" charset="UTF-8"> </script>
        <script>
        window.onload = function() {
          // Begin Swagger UI call region
          const ui = SwaggerUIBundle({
            spec: spec,
            dom_id: '#swagger-ui',
            deepLinking: true,
            presets: [
              SwaggerUIBundle.presets.apis,
              SwaggerUIStandalonePreset
            ],
            plugins: [
              SwaggerUIBundle.plugins.DownloadUrl
            ],
            layout: "StandaloneLayout"
          });
          // End Swagger UI call region
    
          window.ui = ui;
        };
      </script>
      </body>
    </html>


    这不是一个答案。仅仅陈述某人的答案仍然有效并不能使帖子成为答案。如果需要,请将其删除并重新发布为评论。 - GuedesBF
    2
    您说得完全正确。这并不是答案。不幸的是,我没有足够的声望来发表评论。我发布这个的原因是paragbaxi的代码与我们在最新(2021年)的“index.html”布局中所拥有的代码有所不同。我花了一些时间弄清楚应该在哪里更改。我想帮助任何遇到相同问题的人。 如果您仍然认为这应该被删除,并作为评论发布,那么能否请您将我的代码发布为评论,我会删除自己的代码。(谁发布代码对我来说并不重要) - sganabis

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接