抓住Swagger抛出的异常

时间:2014-12-12 08:26:59

标签: exception-handling swagger-ui

我在与Swagger摸索时是新手,所以我可能会问一个愚蠢的问题。是否有可能阻止网站在“无法从api读取”时崩溃?

我的网站大部分时间都在工作,但如果由于某种原因导致api无法读取(或者只是无法访问),那么swagger就会停止工作。它仍然显示它设法达到的api,但所有功能都完全消失,甚至无法扩展一行。

总结:

当一个或多个API无法读取并返回如下内容时,如何防止招摇?:

  

无法从路径中读取api'XXXX'   http://example.com/swagger/api-docs/XXXX(服务器   返回undefined)

以下是我对Swagger的初始化:

function loadSwagger() {
window.swaggerUi = new SwaggerUi({
    url: "/frameworks/swagger/v1/api.json",
    dom_id: "swagger-ui-container",
    supportedSubmitMethods: ['get', 'post', 'put', 'delete'],
    onComplete: function (swaggerApi, swaggerUi) {
        log("Loaded SwaggerUI");

        if (typeof initOAuth == "function") {

            initOAuth({
              clientId: "your-client-id",
              realm: "your-realms",
              appName: "your-app-name"
            });

        }
        $('pre code').each(function (i, e) {
            hljs.highlightBlock(e);
        });
    },
    onFailure: function (data) {
        log("Unable to Load SwaggerUI");
    },
    docExpansion: "none",
    sorter: "alpha"
});

$('#input_apiKey').change(function () {
    var key = $('#input_apiKey')[0].value;
    log("key: " + key);
    if (key && key.trim() != "") {
        log("added key " + key);
        window.authorizations.add("api_key", new ApiKeyAuthorization('api_key', key, 'header'));
    }
});

$('#apiVersionSelectID').change(function () {
    var sel = $('#apiVersionSelectID').val();
    window.swaggerUi.url = sel;
    $('#input_baseUrl').val(sel);
    $('#explore').click();
});

window.swaggerUi.load();

};

1 个答案:

答案 0 :(得分:0)

我也在寻找这个问题的解决方案,但找不到。这是我为解决问题所做的快速破解。希望它对遇到同样麻烦的人有所帮助。

在swagger-client.js中找到函数错误:function(response){

我用addApiDeclaration替换了返回api_fail,使得它即使在失败时也会使用一些有限的信息来绘制api。我发送了一个虚拟的api json对象,其路径设置为" /无法加载' + _this.url。我发送了一个额外的参数,可以是true或false,其中true表示这是一个失败的api。

旧代码:

enter cerror: function (response) {
      _this.api.resourceCount += 1;
      return _this.api.fail('Unable to read api \'' +
      _this.name + '\' from path ' + _this.url + ' (server returned ' +response.statusText + ')');
    }

新代码

 error: function (response) {
      _this.api.resourceCount += 1;                                
      return _this.addApiDeclaration(JSON.parse('{"apis":[{"path":"/unable to load ' + _this.url + '","operations":[{"nickname":"A","method":" "}]}],"models":{}}'), true);
    }

我修改了同一文件中的addApiDeclaration函数,为失败的api显示不同的消息,方法是先向其添加一个名为failed的辅助参数,然后再检查if语句是否为true,然后更改api的名称到#34;未能加载资源" + this.name。这会在失败的api之前添加FAILED TO LOAD RESOURCE文本。

旧代码

 SwaggerResource.prototype.addApiDeclaration = function (response) {
  if (typeof response.produces === 'string')
    this.produces = response.produces;
  if (typeof response.consumes === 'string')
    this.consumes = response.consumes;
  if ((typeof response.basePath === 'string') && response.basePath.replace(/\s/g, '').length > 0)
    this.basePath = response.basePath.indexOf('http') === -1 ? this.getAbsoluteBasePath(response.basePath) : response.basePath;
  this.resourcePath = response.resourcePath;
  this.addModels(response.models);
  if (response.apis) {
    for (var i = 0 ; i < response.apis.length; i++) {
      var endpoint = response.apis[i];
      this.addOperations(endpoint.path, endpoint.operations, response.consumes, response.produces);
    }
  }
  this.api[this.name] = this;
  this.ready = true;
  if(this.api.resourceCount === this.api.expectedResourceCount)
    this.api.finish();
  return this;
};

新代码

SwaggerResource.prototype.addApiDeclaration = function (response, failed) {
  if (typeof response.produces === 'string')
    this.produces = response.produces;
  if (typeof response.consumes === 'string')
    this.consumes = response.consumes;
  if ((typeof response.basePath === 'string') && response.basePath.replace(/\s/g, '').length > 0)
    this.basePath = response.basePath.indexOf('http') === -1 ? this.getAbsoluteBasePath(response.basePath) : response.basePath;
  this.resourcePath = response.resourcePath;
  this.addModels(response.models);
  if (response.apis) {
    for (var i = 0 ; i < response.apis.length; i++) {
      var endpoint = response.apis[i];
      this.addOperations(endpoint.path, endpoint.operations, response.consumes, response.produces);
    }
  }
  if (failed == true) {
      this.name = "FAILED TO LOAD RESOURCE - " + this.name;
  }
  this.api[this.name] = this;
  this.ready = true;
  if(this.api.resourceCount === this.api.expectedResourceCount)
    this.api.finish();
  return this;
};