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.
