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。
该消息正在吞噬实际错误。
问题要么是 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);
});
}
我是 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。
该消息正在吞噬实际错误。 问题要么是 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);
});
}