2017-12-18 1 views
0

Ich schreibe ein SDK und ich verwende eine Methode CallApi, um die repetitive Arbeit für den Aufbau einer HTTP-Anfrage zu tun.Wie man eine Schnittstelle dynamisch benutzt?

Hier ist sie:

private callApi(method: string, route: string, options?: object, body?: object) { 

// build up query parameters 
let params = new HttpParams(); 
if (options) { 
    _.forOwn(options, (val, key) => { 
    params.append(key, val); 
    }) 
} 

// get and delete don't have a body 
if (method == 'get' || method === 'delete') { 
    return this.http[method](this.apiurl + route, { 
    params: params, 
    headers: new HttpHeaders().set('Authorization', 'Bearer ' + this.GetToken()) 
    }) 
} else { 
    return this.http[method](this.apiurl + route, body, { 
    params: params, 
    headers: new HttpHeaders().set('Authorization', 'Bearer ' + this.GetToken()) 
    }) 
} 
} 

Ich möchte es mit einer anderen Methode nennen, zum Beispiel:

ListCategories: (options?: object) => { 
    return this.callApi('get', '/me/categories', options) 
}, 

Aber ich würde auch irgendwie gern haben sie diese Methode aufrufen, mit eine Schnittstelle, die für die aufrufende Methode spezifisch ist.

Also zum Beispiel, wenn ich ListCategories aufrufen würde ich erwarten, dass diese generische Methode callApi irgendwie die Schnittstelle für List Kategorien kennen. Wie kann ich das erreichen? Ich habe versucht, die Schnittstelle zu übergeben, aber während ich über Schnittstellen lese, sieht es nicht so aus, als ob sie während der Laufzeit existieren.

+0

Verwendung ein generischer Typ '' Aravind

+0

Aber ich würde eine bestimmte Schnittstelle mögen. Ich habe die Methode aktualisiert, die es aufruft: ListCategories: (Optionen ?: Objekt): Observable was zu tun scheint, was ich will. Im Grunde hat die Methode, die sie aufruft, die Schnittstelle definiert, CallApi nicht. Ich denke, das ist in Ordnung. Vielleicht nicht Best Practices? –

+2

* da ich über Schnittstellen lese, sieht es nicht so aus, als ob sie während der Laufzeit existieren * - sie sicherlich nicht. Sie haben möglicherweise XY-Problem. Überlegen Sie, ob Sie detailliert erläutern möchten, was Sie erreichen möchten. Was sind diese Schnittstellen und wie genau callApi sollte von ihnen betroffen sein. – estus

Antwort

0

Scheint, als ob Sie Dinge wie Interzeptoren suchen. Wenn dies der Fall ist, können Sie den eckigen Abfangjäger verwenden.

für die unten angegebenen aussehen Else Lsg Methode http.request.

export class CustomHttpService { 
    private apiurl: string; 

    constructor(private http: Http) { 
    // test 
    } 
    public callApi<T>(method: string, route: string, options?: object, body?: object): Observable<T> { 
    const params = new HttpParams(); 
    if (options) { 
     _.forOwn (options, (val, key) => { 
     params.append (key, val); 
     }); 
    } 
    const headers = new Headers(); 
    headers.set ('Authorization', 'Bearer ' + this.getTaken()) 
    return this.http.request (this.apiurl + route, { 
     method, 
     body, 
     params, 
     headers 
    }).map ((response) => response.json()); 
    } 
    private getTaken() { 
    return 'xxxx'; 
    } 
}