Swagger编辑器显示“无法获取”错误

时间:2017-04-12 17:04:05

标签: swagger-editor

我是Swagger的新手,并在我的桌面上使用本地运行的Swagger Editor来测试API。我不负责服务器配置,也无权进行更改。我已设置安全定义并且我的授权正常。现在我正在尝试设置我的第一个路径模式,但是当我执行它时,我收到一条错误消息,上面写着“TypeError:Failed to fetch”,而Response Headers字段为空。

enter image description here

但是,当我复制Swagger编辑器提供的Curl请求并在GitBash中运行它时,它会返回我期望的值。所以我知道Swagger Editor已经创建了一个工作请求。

我知道我的安全授权正在运行,因为我可以看到它在Curl请求中返回的令牌。

身份验证架构和路径架构都命中了不同的子域。身份验证由betaauthorize.myDomain.com处理,而路径由betaapi.myDoamin.com处理。

我在浏览器控制台中遇到的错误对我来说意义不大。 enter image description here

同样,我正在从桌面硬盘驱动器上运行Swagger Editor。是否存在某种我错过的Swagger Editor配置设置?我需要让服务器管理员知道的服务器配置问题吗?我一直在努力解决这个问题两天,我完全没有想法。任何建议将不胜感激。

4 个答案:

答案 0 :(得分:2)

事实证明,我的代码需要所有请求的授权密钥,包括OPTIONS请求。经过一些研究和咨询后,我确定最佳做法是在没有任何授权的情况下回应OPTIONS请求 - 后续请求需要授权。一旦我修改了代码以便在没有OPTIONS请求授权的情况下继续进行,我就能让Swagger为我的项目工作。

答案 1 :(得分:1)

通常,当您使用错误的HTTP / HTTPS方案时会出现此错误。在您的招摇页面上,有一个方案下拉列表。如果您正在运行http,请确保未选择https。 Https是默认值。

答案 2 :(得分:1)

该消息吞噬了实际错误。 问题可能是API配置错误(例如CORS不允许返回json文件),或者是Swagger配置本身。

这里有一些尝试。 在运行Swagger并在浏览器中显示消息

直接浏览到JSON网址本身(例如: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查看堆栈跟踪以确定原因。

发生这种情况的一个原因是因为您在一个不是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个不同名称空间的类'Something'具有相同的架构,因此Swagger扼流圈是相同的。一种解决方法是将Swagger配置为完全限定架构ID,因此,将DoSomething()方法中的 Something 和DoSomethingElse()方法中的 Something 标识为<生成.json文件时Swagger的strong> Datamodel.Something 和 IdenticalDatamodel.Something

为此,您可以在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);
    });
}

答案 3 :(得分:0)

我遇到了同样的问题。当swagger-edist托管在与API不同的域上时,就会出现问题。

您将不得不更改它或设置适当的CORS标头。

Here is a link to the swagger documentation和其他信息。