无法加载外部API定义

时间:2019-07-09 09:11:04

标签: cors swagger openapi swagger-editor

我们正在使用SwaggerEditor编写OAS3 API规范。现在,我们希望朝着更有条理的设置迈进,在该设置中,我们将经常使用的通用定义(例如,某些参数,错误,对象类型)移动到某些共享文件中,以供其他API引用。 / p>

OAS3使用普通的$ref关键字来支持此操作,例如:

$ref: "http://example.com/shared.yaml#/components/schemas/Person"

到目前为止我们尝试过的事情

  • 我们使用绝对URL ,即不是相对路径。

  • 我们使用指向我们的规范文件的url=查询参数启动SwaggerEditor。

    ->共享API文件的指定URL显示在服务API标题下方的编辑器的Swagger UI部分中(右侧),因此这似乎可行。

  • 我尝试使用的引用是指向YAML文件的绝对URL,该文件与swagger编辑器(在Apache Tomcat中)托管在同一台计算机上。例如:

    $ref: "http://127.0.0.1:8080/foo/bar.yaml#/components/schemas/Person"

我设法启动SwaggerEditor而没有CORS错误(在搜索此问题时这很常见,而且也是我们首先遇到的)。我可以在浏览器控制台中进行验证:

  • 外部YAML文件实际上与所需的CORS标头(Access-Control-... *)一起发送
  • 浏览器控制台中没有其他错误。

但是外部引用仍然无法解析:编辑器实际上并不检查给定的定义(在上面的示例Person中)是否存在-因此,如果我引用一些虚假单词,则不会显示任何错误。此外,右侧的交互式Swagger UI部分未正确显示链接类型...即它不能正常工作。

不是CORS问题

(起初我们也遇到了这个问题,但是现在请按照以下步骤解决。)

  • 我确保为共享的YAML(上面的{bar.yaml)设置了相应的CORS标头,即在Apache Tomcat的web.xml上设置了过滤器。我验证了对YAML文件的请求获取了CORS标头-我正在获取...

    Access-Control-Allow-Origin *

  • 在打开SwaggerEditor时,请确保首先清除浏览器缓存,因为可能是浏览器仍然有对所引用的外部YAML文件的请求缓存,从而记住了丢失的CORS标头。这可能会导致SwaggerEditor显示CORS错误 1 ,即使与此同时在服务器上使用正确的标头为引用的资源提供服务。有关该错误的更多详细信息,也可以在浏览器开发者控制台 2 中找到。

  • 清除缓存后,我的SwaggerEditor再次正确加载了文件,看到了CORS标头并停止抛出CORS错误。


1 这是editor.swagger.io显示的错误:

  

错误

     

获取错误
  无法获取http://127.0.0.1:8080/foo/bar.yaml

     

获取错误
  可能存在跨域(CORS)问题? URL来源(http://127.0.0.1:8080)与页面(http://editor.swagger.io)不匹配。检查服务器是否返回正确的“ Access-Control-Allow- *”标头。

2 尝试通过外部引用加载API时,浏览器JS控制台显示错误:

  

通过CORS策略阻止从原点“ http://127.0.0.1:8080/foo/bar.yaml”到“ http://editor.swagger.io”的访存:所请求的资源上没有“ Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“ no-cors”以在禁用CORS的情况下获取资源。

1 个答案:

答案 0 :(得分:0)

我终于能够解决我们的问题。调用SwaggerEditor时,我们使用的查询参数错误。

要正确加载(并解析)外部YAML规范,应使用查询参数configUrl(而不是url!)。例如:

http://127.0.0.1:8080/swagger-editor-master/?configUrl=http://127.0.0.1:8080/foo/bar.yaml

哪里...

  • http://127.0.0.1:8080/swagger-editor-master/指向Swagger编辑器,并且
  • http://127.0.0.1:8080/foo/bar.yaml指向我们要从Swagger编辑器中当前编辑的内容中引用的规范文件。

像这样引用外部规范,例如

$ref: "http://127.0.0.1:8080/foo/bar.yaml#/components/schemas/Payment"

将在右侧的Swagger UI中正确解析(例如,在Schemas部分中,引用的属性是可扩展的,等等)。但是,如果给出了无效的外部引用,似乎编辑器不会抛出错误(相反,Swagger UI只会显示一个“空”对象)。