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

swagger-ui不显示问题定位

如何使用 springfox 在 Swagger UI 中绕过授权

将应用程序身份验证添加到 Swagger UI

Swagger 声明 schema = @Schema(implementation = Map.class) 将 Schema 表示为 swagger-ui 中的 String