Swagger 编辑器显示 "Failed to fetch" 错误

Swagger Editor shows "Failed to fetch" error

我是 Swagger 的新手,我在桌面上本地使用 Swagger Editor 运行ning 来测试 API。我不负责服务器配置,也无权进行更改。我已经设置了我的安全定义并且我的授权有效。现在我正在尝试设置我的第一个路径架构,但是当我执行它时,我收到一条错误消息,显示 "TypeError: Failed to fetch" 并且 Response Headers 字段为空。

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

我知道我的安全授权有效,因为我可以在 Curl 请求中看到它 returns 的令牌。

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

处理

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

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

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

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

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

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

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

Here is a link to the swagger documentation 以及更多信息。

该消息正在吞噬实际错误。 问题要么是 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 的堆栈跟踪以确定原因。

发生这种情况的一个原因是因为控制器中的 public 方法不是 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 个不同命名空间的 Class 'Something' 具有相同的架构,因此 Swagger 会因为它们相同而窒息。解决此问题的一种方法是配置 Swagger 以完全限定架构 ID,因此 DoSomething() 方法中的 Something 和 DoSomethingElse() 方法中的 Something在生成 .json 文件

为此,您可以在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);
    });
}