【问题标题】:Swagger Editor shows "Failed to fetch" errorSwagger 编辑器显示“无法获取”错误
【发布时间】:2017-04-12 17:04:05
【问题描述】:

我是 Swagger 的新手,我使用在我的桌面上本地运行的 Swagger Editor 来测试 API。我不负责服务器配置,也无权进行更改。我已经设置了安全定义并且我的授权工作。现在我正在尝试设置我的第一个路径模式,但是当我执行它时,我收到一条错误消息,上面写着“TypeError:无法获取”并且响应标头字段为空。

但是,当我复制 Swagger Editor 提供的 Curl 请求并在 GitBash 中运行它时,它会返回我期望的值。所以我知道 Swagger Editor 已经创建了一个工作请求。

我知道我的安全授权正在工作,因为我可以看到它在 Curl 请求中返回的令牌。

身份验证架构和路径架构都命中不同的子域。身份验证由 betaauthorize.myDomain.com 处理,而路径由 betaapi.myDoamin.com 处理。

我在浏览器控制台中遇到的错误对我来说意义不大。

再次,我正在从我的桌面硬盘驱动器运行 Swagger Editor。我是否缺少某种 Swagger Editor 配置设置?是否存在我需要让服务器管理员知道的服务器配置问题?这两天我一直在试图解决这个问题,但我完全没有想法。任何建议将不胜感激。

【问题讨论】:

  • 浏览器控制台有错误吗?
  • 好问题@Helen。我在原始描述中添加了控制台错误的捕获。
  • 我遇到了这个问题,我通过从 Startup Configure 方法中删除 app.Run(context => { context.Response.Redirect("swagger"); return Task.CompletedTask; }); 解决了这个问题。

标签: swagger-editor


【解决方案1】:

当您使用错误的 HTTP/HTTPS 方案时,通常会出现此错误。在您的招摇页面上,有一个方案下拉菜单。如果您正在运行 http,请确保您没有选择 https。 Https 是默认的。

另外,请确保使用正确的 HTTPS 访问 SwaggerUI。

【讨论】:

    【解决方案2】:

    事实证明,我的代码对所有请求都需要授权密钥,包括 OPTIONS 请求。经过一些研究和咨询,我确定最好的做法是在没有任何授权的情况下响应 OPTIONS 请求 - 后续请求应该需要授权。一旦我修改了代码以在未经授权的情况下继续处理 OPTIONS 请求,我就可以让 Swagger 为我的项目工作。

    【讨论】:

    • 您在哪里看到“选项”?你能举一个具体的案例吗?
    • 使用 Chrome,我使用 F12 键打开开发工具。然后您可以在“网络”选项卡中看到请求 - 包括选项请求。恐怕我无法发布有关此案例的任何其他详细信息,因为它是为工作而完成的。
    【解决方案3】:

    该消息正在吞噬实际错误。 问题要么是 API 配置错误,例如 CORS 不允许返回 json 文件,要么是 Swagger 配置本身。

    这里有一些可以尝试的方法。 随着 Swagger 的运行和浏览器中的消息

    直接浏览到 JSON url 本身(例如:http://myserver.domain:port/swagger/v1/swagger.json)。如果您收到 404 错误, SwaggerEndpoint 值不正确。

    SwaggerEndpoint("incorrect/v1/swagger.json", "My incorrect Application Version 1");
    SwaggerEndpoint("v1/swagger.json", "My correct Application Version 1");
    

    一旦您尝试从正确的路径检索 swagger.json 文件,您将在浏览器中看到 JSON,或者 Swagger 方法调用出现异常。您可以从 Swagger 中查看堆栈跟踪以确定原因。

    发生这种情况的一个原因是因为控制器中有一个不是 API 端点的公共方法,但 Swagger 认为它是,直到它无法读取 HTTPAttribute 以确定端点正在使用的动词(即: GET、POST ...) 或路由 (/controller/action/{parameter:dataType}/somethingElse)

    // This should be private, not public!
    public ReturnType MyHelperMethod(object parameter){
        //Do something to parameter
        return InstanceOfReturnType;
    }
    

    另一个原因是,如果使用的不同数据模型不是唯一的架构,并且您没有配置 swagger 来完全限定架构模型以保证唯一性。

    示例:-

     [HttpGet, Route("something", Name = "Do Something")]
     public IActionResult DoSomething([FromBody] Datamodel.Something something)
     {
         var returnValue = Service.DoSomething(something);
         return returnValue;
     }
    
     [HttpGet, Route("somethingElse", Name = "Do Something Else")]
     public IActionResult DoSomethingElse([FromBody] IdenticalDatamodel.Something somethingElse)
     {
         var returnValue = Service.DoSomethingElse(somethingElse);
         return returnValue;
     }
    
    namespace IdenticalDatamodel {
        public class Something {
             public string SomeProperty{ get; set;}
        }
    }
    
    namespace Datamodel {
        public class Something {
            public string SomeProperty{ get; set;}
        }
    }
    

    在这种情况下,来自 2 个不同命名空间的类“Something”具有相同的架构,因此 Swagger 窒息,因为它们是相同的。对此的一种解决方法是将 Swagger 配置为完全限定 Schema Id,因此 DoSomething() 方法中的 Something 和 DoSomethingElse() 方法中的 Something 将被标识为 Datamodel.Something 和 IdenticalDatamodel.Something

    为此,您可以在 Startup.cs 中使用以下代码

    public void ConfigureServices(IServiceCollection services)
    {
        //Add a bunch of service configurations here
        // ...
    
        // It's probably better to externalize the Swagger config to it's own private helper method
        services.AddSwaggerGen(swagger =>
        {
                // Setup your Swagger doc, security etc here
        });
    
        // Customize the Swagger generator here
        services.ConfigureSwaggerGen(options =>
        {
                // Use fully qualified schema object names to ensure uniqueness
                options.CustomSchemaIds(configuration => configuration.FullName);
        });
    }
    

    【讨论】:

      【解决方案4】:

      我也遇到了同样的问题。当 swagger-editor 托管在与 API 不同的域上时,就会出现问题。

      您必须更改它或设置适当的 CORS 标头。

      Here is a link to the swagger documentation 附加信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-02
        • 1970-01-01
        • 2012-12-30
        • 2022-11-12
        相关资源
        最近更新 更多