Swagger UI - 有效响应中的“TypeError:无法获取”
Posted
技术标签:
【中文标题】Swagger UI - 有效响应中的“TypeError:无法获取”【英文标题】:Swagger UI - " TypeError: Failed to fetch" on valid response 【发布时间】:2017-12-22 17:23:19 【问题描述】:我刚刚使用:https://github.com/swagger-api/swagger-ui.git 从 Git 存储库 (3.0.19) 中下载了最新的 Swagger,并更新了我的 API 以使用新版本。
跑git describe --tags
确认,我目前的版本是:v3.0.19-6-gaab1403
我遇到的问题是 here 描述的问题,我的响应是 403(我可以在浏览器的检查器中看到这个),虽然我对错误 403 有响应,但我仍然收到 @987654334 @消息。
这是我对 403 响应的定义中的一个 sn-p:
"403":
"description": "Forbidden",
"headers":
"Access-Control-Allow-Origin":
"type": "string"
,
我也注意到它报告了here 但是,我知道这不是 CORS 问题,因为我已经测试了端点并且 OPTIONS 返回正确,如果使用有效信息调用端点也是如此(我强制执行此 403) .
谁能指点我正确的方向?
更新:我已经测试了 401 响应,响应相同。
400 按预期工作:
【问题讨论】:
如果处于开发阶段,请确保解决方案/服务器正在实际运行,并且您没有尝试使用缓存网页。 【参考方案1】:这是因为有时您的 IIS 绑定的 HTTPS SSL 证书会自动转到未选择。所以你又一次提出了一个类似的问题,但很少有好的答案请参考此链接以手动选择将 SSL 证书获取到 1 IIS Express 开发证书 1。下面我提到了如何回答:
打开 IIS 单击默认网站。 在右上角你会看到一些设置点击“绑定”,你会得到一个站点绑定窗口。 然后您将获得 http 和 https 详细信息。 在那单击“https”并单击编辑,然后您将获得另一个窗口编辑站点绑定。 在该窗口中检查 SSL 证书。 如果 SSL 证书 = 未选择,请选择 IIS Express 开发证书。 然后停止并启动 IIS。 问题将得到解决。
【讨论】:
【参考方案2】:如果是 .NET Core API,请尝试在 StartUp.cs 中注释掉以下方法调用 如下所示,
// app.UseHttpsRedirection();
【讨论】:
【参考方案3】:我遇到了同样的问题,并且有一个非常简单的解决方法。我使用 HTTP 访问我的网站,但它需要 HTTPS。我的网站在调用端点时重定向到 HTTPS。
这违反了“同源政策”: https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.2
【讨论】:
我也是,这样解决。刚刚将 Schemes HTTPS 更改为 HTTP,因为我的 API 在 HTTP 上。 我在 .NET Core 应用程序中遇到了同样的问题。问题是Configure
方法中我的Startup.cs
文件中的这一行:app.UseHttpsRedirection();
。这导致从 HTTP 切换到 HTTPS,从而导致 CORS 错误。【参考方案4】:
每个解决方案肯定都是正确的 :) 但就我而言,我的 webconfig 文件中有这一行
<environmentVariable name="ASPNETCORE_HTTPS_PORT" value="5001" />
我只是将 ASPNETCORE_HTTPS_PORT 替换为 ASPNETCORE_HTTP_PORT 并且错误已经消失 :)。所以最后一行是
<environmentVariable name="ASPNETCORE_HTTP_PORT" value="5001" />
将 5001 替换为您的端口。
【讨论】:
【参考方案5】:这个错误在招摇方面是普遍的,可能是由于许多可能的原因。 就我而言,这是由于连接错误。由于我身边的连接问题,我的招摇页面没有响应。我必须刷新一次并为我工作。
【讨论】:
【参考方案6】:我在尝试验证访问 OAuth2 保护的 Rest API 集时遇到了同样的错误。 API 服务器部署在 VM 上并使用 IPSEC *** 连接到它。实际上,具有基本身份验证的 HTTP 标头中的用户名/密码是使用 /oauth/token 以外的单独 API 发送的,后端本身使用客户端密钥调用 http://localhost:8080/api/v0/oauth/token 并将令牌返回给客户端。将 localhost 更改为服务器的实际本地 IP 后,问题消失了。
【讨论】:
【参考方案7】:请检查提供给 swagger jsdoc 的 swaggerOptions 并检查主机名和基本名是否正确。我以前遇到过同样的问题,并通过纠正这个问题解决了这个问题。希望这也能解决问题。
例如:
const options =
swagger: "2.0",
swaggerDefinition:
// options.swaggerDefinition could be also options.definition
info:
title: "Customer API", // Title (required)
description: "Dummy Customer API for implementing swagger",
contact:
name: "Stack Overflow"
,
version: "1.0.0" // Version (required)
,
host: "localhost:5000",
basePath: "/"
,
// Path to the API docs
apis: ["SwaggerImplementation/index.js"] // For complex api's pass something like apis: ["./routes/*.js"]
;
【讨论】:
【参考方案8】:免责声明:- 此答案适用于使用 Asp.net Core 开发的 API
我在尝试从 Swagger UI 编辑器访问 API 时遇到了类似的问题。 我试图访问一些使用 Asp.net Core 开发的 API,因为 Swagger UI 编辑器托管在 Apache 上。我遇到了 CORS(跨组织请求)。
我必须使用以下代码修改我的 API 代码以允许 CORS 请求:- 在具有类“StartupShutdownHandler”的 Startup.cs 文件中声明
private readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
在 ConfigureServices 方法中添加了一段代码。
var str = ConfigurationHandler.GetSection<string>(StringConstants.AppSettingsKeys.CORSWhitelistedURL);
if (!string.IsNullOrEmpty(str))
services.AddCors(options =>
options.AddPolicy(MyAllowSpecificOrigins,
builder =>
builder.WithOrigins(str);
);
);
在配置方法中添加了一行代码。
app.UseCors(MyAllowSpecificOrigins);
参考Enable Cross-Origin Requests (CORS) in ASP.NET Core
【讨论】:
【参考方案9】:我在本地开发过程中遇到了这个错误(即与 AWS 无关)。根本原因(违反CORS)是相同的。以下内容可能会对遇到此问题的其他人有所帮助。
我使用引用 http://localhost:9090/ 的 openapi 规范设置了 connexion。当开发服务器启动时,它会显示“Running on http://0.0.0.0:9090/”。该页面似乎工作,但招摇 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
命令运行良好;虽然最初令人困惑,但 curl 成功表明问题是由于浏览器阻塞而不是服务器端故障引起的。
(Connexion 基于 Python flask,提供对 openapi 集成的扩展支持。)
【讨论】:
是的 - 我在本地也遇到了同样的问题。这是一个 CORS 问题。 另一种解决此问题的简单方法是使用the built in feature in Safari to disable cors checks for the current browser session【参考方案10】:因为跨域问题是指你的网站不是托管在本地或者是8000端口或者不同的端口,而且你swagger的端口号不同,所以这个问题是真的。我们可以通过授予权限来修复它。
这是节点代码:
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
【讨论】:
【参考方案11】:对于遇到此问题的任何人;
经过一天的故障排除和 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 页):
https://forums.aws.amazon.com/thread.jspa?messageID=728839
【讨论】:
我添加了Access-Control-Allow-Origin:*
,但仍然遇到错误
如果它可以帮助其他人......这是我在最后一个线程中实际寻找的链接(网关响应)。 https://aws.amazon.com/about-aws/whats-new/2017/06/amazon-api-gateway-enables-customization-of-error-responses/以上是关于Swagger UI - 有效响应中的“TypeError:无法获取”的主要内容,如果未能解决你的问题,请参考以下文章
多响应正文示例取决于 OpenApi 3.0.0/Swagger 中的媒体类型
当试图打开Swagger-UI时只获得一个json Response
如何使用 springfox 在 Swagger UI 中绕过授权
Swagger 声明 schema = @Schema(implementation = Map.class) 将 Schema 表示为 swagger-ui 中的 String