2017-11-20 5 views
0

Ich habe eine API, die ISO-Datum zurückgibt, das in Javascript-Datum umgewandelt werden muss. Ich verwende das HTTPClient-Modul, das die Zuordnung automatisch durchführt, aber es scheint, dass es die empfangenen Daten nicht transformiert.Angular 4 HttpClient Datenabbildung

Ich weiß, dass es funktioniert, wenn ich es mit dem HTTP-Modul, aber ich möchte den HTTPClient verwenden.

Mein Code ist unten.

export class Product{ 
    datetime: string; 
    qty: number; 
    constructor(date: string, hr: number) { 
     this.datetime = new Date(Date.parse(date)); 
     this.heartrate = hr; 
     } 
    } 



    @Injectable() 
    export class BandHeartRate { 

     private Url = 'http://192.168.1.1:6000'; 
     constructor(private http: HttpClient) {} 

    public getProduct(): Observable<Product[]> { 

      return this.http.get<Product[]>(`${this.Url}/web/api/v2/product`, 
    {headers: this.getHeader()}); 

     } 

     private getHeader() { 
      const header = new HttpHeaders(); 
      header.append('Accept' , 'application/json'); 
      return header; 
     } 
    } 
    } 
+0

wo abonnieren Sie 'getProduct()'? Wo rufst du deine 'Product' Klasse an? – LLai

Antwort

1

Die Antwort auf Ihren HTTP-Aufruf wird ein JSON-Objekt sein. JSON hat keine Darstellung von Daten per se, daher werden Ihre Daten als Strings im Ergebnis dargestellt. Sie haben richtig erkannt, dass Sie diese Zeichenfolgen manuell in Daten umwandeln müssen.

Ihr Code ist grob korrekt, aber Sie gehen davon aus, dass Sie einfach den JSON-Code in eine -Instanz konvertieren können. Das wird nicht funktionieren. Es würde funktionieren, wenn Product eine Schnittstelle wäre, keine Klasse (um eine Instanz einer Klasse zu erstellen, müssen Sie ihren Konstruktor aufrufen, und Ihr Code tut das nirgendwo).

Eine schnelle Lösung ist Ihre Berufung Code wie folgt zu ändern:

this.http.get(`${this.Url}/web/api/v2/product`, 
    {headers: this.getHeader()}) 
.map(productList => productList.map(productJson => new Product(productJson))); 

Diese Konstrukte Product Instanzen der JSON mit aufgenommen (die ersten map sagen Sie das Ergebnis des beobachtbar verwandelt wollen, die zweiten map Transformationen jedes Element in Ihrem JSON-Array von JSON zu Products).

Der Product Konstruktor wird die JSON für ein einzelnes Objekt erhalten, so müssten Sie es ändern etwas zu:

export class Product { 
    date: Date 
    hr: number 

    constructor({dateAsString, hr}) { 
     this.date = new Date(dateAsString); 
     this.hr = hr 
    } 
} 

Wenn Sie über die ({dateAsString, hr}) Syntax sich fragen,, google „Funktionsparameter Destrukturierung“.

+0

Was ich nicht verstehe, ist die ursprüngliche Produktklasse, in der der Konstruktor, den der HttpClient abonniert hat, nicht ausgeführt wird. – AlbertK

+0

Ja, es ist das "Get ", das kann verwirrend sein. Das ändert den JSON, der zurückgegeben wird, nicht wirklich, es behandelt es nur so, als ob * es von diesem Typ wäre. Es ist wie das Schlüsselwort 'as'. Dies ist ziemlich gefährlich, weil Sie den falschen Typ angeben (wie in diesem Fall 'Product []') werden Sie glauben, dass es tatsächlich 'Produkt' Instanzen ist, aber es ist wirklich nicht. Es ist wirklich nur für die Verwendung mit Schnittstellen vorgesehen. Es ist in Ordnung, ein Objekt (das die richtige Struktur hat) als Schnittstelle zu behandeln, aber wenn eine Objektinstanz nicht von einem bestimmten Typ ist, können Sie sie nicht als einen anderen Typ behandeln. – ehrencrona

+0

Ich denke für Typescript zu fälschen und Dinge auf dem Weg zu machen ist verwirrend. OK, wie transformiere ich die Daten über die Schnittstelle. Vielen Dank. – AlbertK