无法读取 Swagger 中的文件问题 UI

Can't read from file issue in Swagger UI

我在申请中加入了swagger-ui

当我尝试查看 swagger-ui 时,我很好地获得了 API 的文档,但过了一段时间后,它在按钮上显示了一些错误图标。

错误信息如下:

[{"level":"error","message":"Can't read from file http://MYIP/swagger/docs/v1"}]

我不确定是什么原因造成的。如果我刷新它会工作并在几秒钟后显示错误。

我猜“http://MYIP/swagger/docs/v1”不能公开访问。

默认情况下,swagger ui 使用在线验证器:online.swagger.io。如果它无法访问您的 swagger url 那么您将看到该错误消息。

可能的解决方案:

  1. 禁用验证:

    config.EnableSwagger().EnableSwaggerUi(c => c.DisableValidator());

  2. 让您的网站可公开访问

  3. 在本地托管验证器:

您可以从以下位置获取验证器:https://github.com/swagger-api/validator-badge#running-locally

您还需要告诉 swaggerui 验证器的位置

config.EnableSwagger().EnableSwaggerUi(c => c.SetValidatorUrl(<validator_url>));

为了补充已接受的答案...我刚刚取消注释 SwaggerConfig.cs 中的一行。我只想通过禁用验证器来摆脱 swagger 主页面上的红色错误。

// By default, swagger-ui will validate specs against swagger.io's online validator and display the result
// in a badge at the bottom of the page. Use these options to set a different validator URL or to disable the
// feature entirely.
//c.SetValidatorUrl("http://localhost/validator");
c.DisableValidator();

如果您使用 PHP Laravel framework with L5-Swagger,只需取消注释

'validatorUrl' => null,

来自配置文件 /config/l5-swagger.php

dist/swagger-ui.js 中设置 this.model.validatorUrl = null; 对我有用..

// Default validator
if(window.location.protocol === 'https:') {
  //this.model.validatorUrl = 'https://online.swagger.io/validator';
  this.model.validatorUrl = null;
} else {
  //this.model.validatorUrl = 'http://online.swagger.io/validator';
  this.model.validatorUrl = null;
}

如果您使用 swagger-ui github 存储库中的文件,则可以通过将 validatorUrl 设置为 null 来禁用 index.html 文件中的模式验证其中:

window.onload = function() {

  // Build a system
  const ui = SwaggerUIBundle({
    url: "/docs/open_api.json",
    dom_id: '#swagger-ui',

    validatorUrl : null,   # <----- Add this line

    deepLinking: true,
    presets: [
      SwaggerUIBundle.presets.apis,
      SwaggerUIStandalonePreset
    ],
    plugins: [
      SwaggerUIBundle.plugins.DownloadUrl
    ],
    layout: "StandaloneLayout"
  })

对于在使用 Swashbuckle.OData 时遇到类似问题的任何人:

我在将 Swagger 与我们的 OData 端点集成时遇到了问题(将 ODataController 用于 API 和 Swashbuckle.OData NuGet 包)。我不得不为它编写我们自己的文档过滤器并添加它:

GlobalConfiguration.Configuration
            .EnableSwagger(c =>
                {
                    c.SingleApiVersion("v1", "OurSolution.API");
                    c.DocumentFilter<SwaggerDocumentFilter>();
                    //c.CustomProvider((defaultProvider) => new ODataSwaggerProvider(defaultProvider, c, GlobalConfiguration.Configuration));
                    c.IncludeXmlComments(GetXmlCommentsPath());
                    c.UseFullTypeNameInSchemaIds();
                    c.RootUrl(req => ConfigurationManager.AppSettings["AppUrl"]);
                })
            .EnableSwaggerUi(c =>
            {
                c.DisableValidator();
            });

显然,为了避免验证错误,我不得不注释掉设置 ODataSwaggerProvider 的行,同时关闭上面帖子中提到的验证器。这使得 Swashbuckle.OData 的实用性受到质疑,但我没有测试它与 vanilla Swashbuckle 一起使用的任何东西。

注意:我使用 GitHub 页面上描述的方法 Swashbuckle.OData 但它不起作用:根本没有显示可能的端点。也许有人知道更好的解决方案。