2016-03-18 52 views
22

Chciałbym skopiować odpowiedź REST do obiektu typu blob, ale nie mogę tego zrobić, ponieważ blob() i arrayBuffer() nie zostały jeszcze zaimplementowane w obiekcie odpowiedzi. Ciało odpowiedzi jest prywatną zmienną.Jak mogę uzyskać dostęp do treści odpowiedzi HTTP 2 Angular bez zamiany jej na ciąg lub json?

... 
return this.http.get(url, {params: params, headers: headers}) 
    .map(res => { 
     // can't access _body because it is private 
     // no method appears to exist to get to the _body without modification    
     new Blob([res._body], {type: res.headers.get('Content-Type')}); 
    }) 
    .catch(this.log); 
... 

Czy istnieje rozwiązanie, które można wykorzystać do czasu wdrożenia tych metod?

Odpowiedz

46

Jest to znacznie prostsze rozwiązanie dostępu ciało jako ciąg znaków, który nie widziałem udokumentowane wszędzie:

let body = res.text() 
+3

Wow! To rozwiązanie faktycznie pozwala npm na kompilację mojego TS! Gdzie to znalazłeś? –

+1

Wystąpiło wiele prób i błędów, więc nie mogę sobie przypomnieć, że się boję. – StudioLE

6

Ponieważ znalazłem to pytanie podczas uruchamiania tego samego problemu (a dokumentacja Angular nie jest aktualizowana od dzisiaj), możesz teraz użyć:

let blob = new Blob([response.arrayBuffer()], { type: contentType }); 

Innym obejście, jeśli z jakiegoś powodu są na starej wersji kątowej 2 jest:

let blob = new Blob([(<any> response)._body], { type: contentType }); 
2

Ustaw typ odpowiedzi requestoptions. To spowoduje, że zadziała metoda response.blob().

 let headers = this.getAuthorizationHeader(); 
    headers.append("Accept", "application/octet-stream"); 
    return this.http 
     .get(url, new RequestOptions({ headers: headers, responseType: ResponseContentType.Blob })) 
     .map((res: Response): Blob => { 
      return res.ok ? res.blob() : undefined; 
     }) 
+0

Więcej informacji na temat nowych funkcji: http://restlet.com/company/blog/2016/08/29/whats-new-in-the-http-module-of-angular-2/, nie zapomnij skorzystać z subskrypcji aby wykorzystać wynik: – bleuscyther

8

Dodatek do @StudioLE. Możesz użyć metody json(), aby zwrócić dane jako json.

let body = res.json() 
+1

To jest absolutnie to, co powinno zostać użyte. W odpowiedzi 'error' można wykonać polecenie' error.json() ', a faktycznie zwrócone dane z interfejsu API będą dostępne w szablonie. – Rexford

+0

Dangit, zapomniałem użyć '.json()' lol dziękuję za tę odpowiedź na szczęście tylko waliłem w głowę przez kilka minut. –