我刚刚使用:https://github.com/swagger-api/swagger-ui.git从Git repo(3.0.19)中删除了最新的Swagger并更新了我的API以使用新版本。
Ran git describe --tags
确认,我的版本目前是:v3.0.19-6-gaab1403
我遇到的问题是一个描述here,我的响应是403(我可以在浏览器的检查器中看到这个),虽然我有错误403的响应,我仍然得到TypeError: Failed to fetch
消息。
这是我对403响应的定义的片段:
"403": {
"description": "Forbidden",
"headers": {
"Access-Control-Allow-Origin": {
"type": "string"
}
}
},
我也注意到它报告了here然而,我知道它不是CORS问题,因为我测试了端点并且OPTIONS返回正确,如果使用有效信息调用端点(我强制使用403)。
有人能指出我正确的方向吗?
更新:我已经测试了401响应,响应相同。
并且400正在按预期工作:
对于任何遇到这个问题的人;
经过一天的故障排除和Swagger支持人员指出我正确的方向后,事实证明这是由AWS API Gateway自定义授权人员中的错误引起的。
我们目前正在使用AWS API Gateway来管理我们的API,这包括通过自定义授权器管理我们的所有授权。问题是自定义授权者当前不支持在响应中传递标头,并且Swagger UI需要响应头中的Access-Control-Allow-Origin:*
来显示正确的HTTP状态代码。
请参阅此AWS线程有关该问题(已超过一年):
https://forums.aws.amazon.com/thread.jspa?messageID=728839
Swagger UI讨论相同:https://github.com/swagger-api/swagger-ui/issues/3403
编辑/更新
此后,通过使用网关响应解决了这个问题。看到同一个论坛(第2页):
我在本地开发期间遇到了这个错误(即与AWS没有任何关系)。根本原因(CORS违规)是相同的。以下内容可能会帮助遇到此问题的其他人。
我用一个提到connexion的openapi规范设置了http://localhost:9090/。当开发服务器启动时,它会显示“在http://0.0.0.0:9090/上运行”。该页似乎有效,但swagger ui使用openapi规范中的http://localhost:9090/进行后续请求,并在结果中显示TypeError: Failed to fetch
。浏览器控制台显示Access to fetch at 'http://localhost:9090/vr/variation' from origin 'http://0.0.0.0:9090'
。提供的curl
命令工作正常;虽然最初令人困惑,但卷曲成功是一个线索,问题是由于浏览器阻塞而不是服务器端故障。
(Connexion基于Python瓶,为openapi集成提供扩展支持。)
因为跨域问题意味着您的网站托管在本地或使用端口8000或不同的端口,并且您的招摇的端口号不同,所以这个问题是真实的。我们可以通过许可来解决它。
这是节点代码:
app.use( (request, response, next) => {
response.header("Access-Control-Allow-Origin", "*");
response.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
我们也可以使用CORS npm来解决。 https://www.npmjs.com/package/cors
免责声明: - 这个答案适用于使用Asp.net Core开发的API
尝试从Swagger UI编辑器访问API时,我遇到了类似的问题。我试图访问使用Asp.net Core开发的一些API,其中Swagger UI编辑器托管在Apache上。我正面临着CORS(Cross Orgin Request)。
我必须使用以下代码修改我的API代码以允许CORS请求: - 在具有类“StartupShutdownHandler”的Startup.cs文件中声明
private readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
在ConfigureServices Method中添加了一段代码。
var str = ConfigurationHandler.GetSection<string>(StringConstants.AppSettingsKeys.CORSWhitelistedURL);
if (!string.IsNullOrEmpty(str))
{
services.AddCors(options =>
{
options.AddPolicy(MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins(str);
});
});
}
在Configure Method中添加了一行代码。
app.UseCors(MyAllowSpecificOrigins);