javascript - Använda genererad Swagger TypeScript Rest-klient i Angular2


Jag arbetar på en Meteor-webbapplikation med Angular 2 och TypeScript. För att använda ett REST API har jag genererat klientkod med Swagger Codegen. Tyvärr finns det inget exempel på GitHub om hur man använder REST-klienten.

Jag har en Angular 2 vykomponent som injicerar en Angular 2-tjänst (ProductTreeService) och det genererade API:et (båda markerade som "@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
    {
        //...
    }
}

Medan endast den angulära tjänsten är åtkomlig och allt fungerar bra, kraschar applikationen när jag injicerar UserApi. Den enda skillnaden mellan UserApi och ProductTreeService är konstruktorn: Tjänsten har inga konstruktorsparametrar, den genererade Api-klassen har:

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

Så hur kan jag injicera den genererade API:n?

Svar #1

Jag skulle använda filen environment.ts med en egenskap för URL:en:

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

Och sedan i app.module tillhandahåller du konfigurationen till tjänsten:

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

Detta fungerar med Swagger-genererad kod.

Hoppas det hjälper! (uppdaterad till Angular6+)

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

Svar #2

Efter ytterligare forskning fick jag lösningen. Konstruktören för REST-klienten UserApi förväntar sig en HTTP-leverantör enligt följande:

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

Kommer från Java, jag trodde kanske att denna leverantör måste initialiseras på något sätt i konstruktorn som injicerar detta API. I själva verket måste denna initialisering göras i NgModule som innehåller den injicerande komponenten, som beskrivs i denna tråd.

Denna lösning fungerade för mig.

Relaterade artiklar