Swagger UI - " TypeError:无法获取"在有效的回应

时间:2017-07-18 02:49:46

标签: swagger swagger-ui swagger-2.0

我使用:https://github.com/swagger-api/swagger-ui.git从Git repo(3.0.19)中删除了最新的Swagger并更新了我的API以使用新版本。

git describe --tags确认,我的版本目前为:v3.0.19-6-gaab1403

我遇到的问题是here,其中我的回复是403(我可以在浏览器的检查器中看到这个),虽然我有错误403的响应,但我仍然得到TypeError: Failed to fetch消息。

enter image description here

enter image description here

以下是我对403响应的定义摘录:

                    "403": {
                    "description": "Forbidden",
                    "headers": {
                        "Access-Control-Allow-Origin": {
                            "type": "string"
                        }
                    }
                },

我还注意到它报告here但是,我知道它不是CORS问题,因为我测试了端点并且OPTIONS返回正确,如果调用端点那么端点也是如此有效信息(我强迫这403)。

有人能指出我正确的方向吗?

更新:我已经对401响应进行了测试,但响应相同。

enter image description here

400正在按预期工作:

enter image description here

11 个答案:

答案 0 :(得分:8)

对于遇到此问题的任何人;

经过一天的故障排除和Swagger支持人员指出我正确的方向,结果证明这是由AWS API Gateway自定义授权者中的错误引起的。

我们目前正在使用AWS API Gateway来管理我们的API,这包括通过自定义授权程序管理我们的所有授权。问题是自定义授权者当前不支持在响应中传递标头,并且Swagger UI需要响应头中的$("#bSubmit").on("click", function (){ $("[name='year']").val(2017 - $("[name='quantity']").val()); }); 来显示正确的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

答案 1 :(得分:3)

我在本地开发期间遇到此错误(即与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命令运行良好;尽管最初令人困惑,但是curl成功表明存在问题的原因是浏览器阻塞而不是服务器端故障。

(Connexion基于Python flask,并提供对openapi集成的扩展支持。)

答案 2 :(得分:1)

因为跨域问题意味着您的网站托管在本地或端口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

答案 3 :(得分:1)

免责声明:-此答案适用于使用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

答案 4 :(得分:0)

请检查为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"]
};

答案 5 :(得分:0)

这是因为有时IIS绑定的HTTPS SSL证书会自动变为“未选中”。因此,再次必须手动将SSL证书选择为IIS Express开发证书1。下面我提到了怎么做:

  1. 打开IIS单击“默认网站”。
  2. 在右上角,您将看到一些设置,单击“绑定”,您将获得一个“站点绑定”窗口。
  3. 然后您将获得http和https的详细信息。
  4. 在那单击“ https”,然后单击“编辑”,然后您将获得另一个窗口“编辑站点绑定”。
  5. 在该窗口中,检查SSL证书。
  6. 如果SSL Certificate = Not Selected,请选择IIS Express开发证书。
  7. 然后停止并启动IIS。

问题将会解决。

答案 6 :(得分:0)

在尝试验证访问OAuth2安全的Rest API集时遇到了相同的错误。 API服务器已部署在VM上,并正在使用IPSEC VPN连接到它。实际上,具有基本身份验证的HTTP标头中的用户名/密码是使用/ oauth / token以外的其他API发送的,后端本身使用客户端机密调用http://localhost:8080/api/v0/oauth/token并将令牌返回给客户端。将localhost更改为服务器的实际本地IP后,问题消失了。

答案 7 :(得分:0)

此错误在招摇方面很常见,可能是由于许多可能的原因所致。 就我而言,这是由于连接错误。由于我身边的连接问题,我的摇摇欲坠的页面没有响应。我不得不刷新一次并为我工作。

答案 8 :(得分:0)

我遇到了同样的问题,并且有一个非常简单的解决方法。我使用HTTP访问了我的网站,但它需要HTTP S 。呼叫端点时,我的网站正在重定向到HTTP S

这违反了“原产地政策”: https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.2

答案 9 :(得分:-1)

每个解决方案都绝对正确:) 但就我而言,我的webconfig文件中有该行

 <environmentVariable name="ASPNETCORE_HTTPS_PORT" value="5001" />  

我只是将ASPNETCORE_HTTPS_PORT替换为ASPNETCORE_HTTP_PORT,错误已经消失了:)。所以最后一行是

  <environmentVariable name="ASPNETCORE_HTTP_PORT" value="5001" />

用端口替换5001。

答案 10 :(得分:-1)

如果是 .NET Core API,请尝试在 StartUp.cs 中注释掉以下方法调用 如下图,

<块引用>

// app.UseHttpsRedirection();