【问题标题】:Creating API factory with SwaggerJS使用 SwaggerJS 创建 API 工厂
【发布时间】:2026-02-16 22:30:01
【问题描述】:

所以我有这个长期存在的 APIService 工厂,它创建函数以将 swagger 函数传递到 UI。这是工厂的 sn-p:

'use strict';

angular.module('myApp').factory('APIService', function ($http, $window, $q, swaggerClient, $mdToast) {
    var ApiDoc = {};

    ApiDoc.getAllBookmarks = function () {
        return $q(function (resolve, reject) {
            $http.get('client/components/api/Schema.json')
                    .success(function (data) {
                        var schema = data;
                        _.each(schema.apis, function (b) {
                            b.apiDeclaration.basePath = $window.location.origin;
                        })

                        var api = swaggerClient(schema);
                        api = api.apiBookmarks.getAll();
                        resolve(api);
                     });
        });
    }
    return ApiDoc;
});

这是它在控制器中的用例的 sn-p:

$scope.getAllDashboards = function () {
    APIService.getAllBookmarks().then(function(data){
        if (data.length > 0){
           $scope.dashboardsList = data;
           $scope.emptyDash = false;
        } else {
           $scope.emptyDash = true;
        }
    })
}

$scope.getAllDashboards();

这里的固有问题是,如果我在控制器中有 30 个 API 函数调用,那么对于 schema.json 的 30 个 $http 请求实际上是不需要的。问题是我无法弄清楚如何请求/存储该 json 并以与现在相同的方式大摇大摆地调用函数(否则我必须更改控制器中的 200 多个方法,呃)。我试过这个:

// var api = null;
// $http.get('client/components/api/Schema.json')
//     .success(function (data) {
//         var schema = data;
//         _.each(schema.apis, function (b) {
//             b.apiDeclaration.basePath = $window.location.origin;
//         })
//         api = swaggerClient(schema);
//     });

但在此之后无法获取函数以正确读取它,或者像控制器期望的那样在 promise 中返回函数调用的结果。

我这里没有其他 JS 开发人员,所以我需要大家的帮助!非常感谢!

【问题讨论】:

  • 您好,您使用的是什么版本的 swagger 定义?
  • Swagger UI - 2.0.24,swagger-angular-client - 0.1.11

标签: javascript angularjs json swagger swagger-ui


【解决方案1】:

太丑了。如果您将 swagger-client 升级到更现代的东西,您有一些选择。

首先,您可以将架构缓存为对象,并使用参数spec 在您的 swaggerClient 构造函数中提供它。在构建它时,您仍然需要将目标主机的 URL 传递给客户端。有了它,就不需要远程调用任何东西了。

接下来,您可以了解如何保留适当的 swaggerClient 实例,并在每次调用中使用它。

【讨论】:

  • 我必须看看我们是否可以升级到 SwaggerUI 2.1.4 和 angular swagger 客户端到 0.1.12,虽然那里更新不多。