在 Angular2 中使用生成的 Swagger TypeScript Rest Client

Posted

技术标签:

【中文标题】在 Angular2 中使用生成的 Swagger TypeScript Rest Client【英文标题】:Using generated Swagger TypeScript Rest Client in Angular2 【发布时间】:2017-01-15 07:45:05 【问题描述】:

我正在使用 Angular 2 和 TypeScript 开发 Meteor Web 应用程序。为了使用 REST API,我使用 Swagger Codegen 生成了客户端代码。可惜GitHub上没有样例,如何使用其余客户端。

我有一个 Angular 2 视图组件,它正在注入一个 Angular 2 服务 (ProductTreeService) 和生成的 API(都标记为“@Injectable”):

@Component(
    selector: 'panel-product-selection',
    template,
    providers: [ProductTreeService, UserApi],
    directives: [ProductTreeComponent]
)

export class PanelProductSelectionComponent

    private categoriesProductsTree: Collections.LinkedList<CategoryTreeElement>;
    private productTreeService: ProductTreeService;
    private userApi: UserApi;

    constructor(productTreeService: ProductTreeService, userApi: UserApi)
    
        this.productTreeService = productTreeService;
        this.userApi = userApi;
    

    ngOnInit(): void
    
        //...
    

虽然只能访问 Angular 服务并且一切正常,但当我注入 UserApi 时应用程序崩溃了。 UserApi和ProductTreeService的唯一区别就是构造函数:服务没有构造函数参数,生成的Api class有:

constructor(protected http: Http, @Optional()@Inject(BASE_PATH) basePath: string) 
    if (basePath) 
        this.basePath = basePath;
    

那么如何注入生成的 API?

【问题讨论】:

能否请您包含一些生成的代码? UserApi,那不只是提供的示例吗?您链接到的代码并不意味着包含在项目中——它是生成代码的示例。 这是一个使用 Swagger Codegen 生成的 Typescript-angular2 API 客户端的示例:github.com/taxpon/ng2-swagger-example。这会有帮助吗? 【参考方案1】:

经过进一步研究,我得到了解决方案。其余客户端 UserApi 的构造函数期望 HTTP 提供程序如下:

constructor(protected http: Http, @Optional()@Inject(BASE_PATH) basePath: string) 
    if (basePath) 
        this.basePath = basePath;
    

来自 Java,我认为可能必须在注入此 API 的构造函数中以某种方式初始化此提供程序。实际上,这个初始化必须在包含注入组件的 NgModule 中完成,如 thread 中所述。

这个解决方案对我有用。

【讨论】:

【参考方案2】:

老问题,但是……你应该这样做:

providers: [

  provide: API_BASE_URL, // or BASE_PATH
  useFactory: () =>  
      return environment.apiBaseUrl // or return just "your base url as text"
  
]

【讨论】:

您能否添加更多信息,说明为什么应该这样做。 哦,原来是缺少 Http Provider。我的解决方案是如何将基本 url 注入自动生成的客户端 @PaD 您能否举例说明当apiBaseUrl 来自 APP_INITIALIZER 上加载的配置 JSON 文件时如何执行此操作?【参考方案3】:

我会使用带有 url 属性的 environment.ts 文件:

export const environment = 
  production: false,
  basePath: 'https://virtserver.swaggerhub.com/user/project/1.0.0'
;

然后在 app.module 中为服务提供配置:

  providers: [
     provide: BASE_PATH, useValue: environment.basePath ,
  ],

这适用于 Swagger 生成的代码。

希望对您有所帮助! (更新到Angular6+)

https://blog.angulartraining.com/how-to-manage-different-environments-with-angular-cli-883c26e99d15

【讨论】:

以上是关于在 Angular2 中使用生成的 Swagger TypeScript Rest Client的主要内容,如果未能解决你的问题,请参考以下文章

Swagger结合mustache模板生成后台接口代码以及前后台建模代码

浅析如何在Nancy中使用Swagger生成API文档

如何在Nancy中使用Swagger生成API文档?

.net core 使用swagger生成API文档

Web Api 2.0中使用Swagger生成Api文档的2个小Tips

使用 Spring REST Docs 生成 Swagger 客户端