2016-03-18 44 views
22

Vorrei copiare una risposta REST in un BLOB, ma non sono in grado di eseguire alcuna operazione poiché blob() e arrayBuffer() non sono ancora stati implementati nell'oggetto risposta. Il corpo di risposta è una variabile privata.Come posso accedere al corpo della risposta http Angular 2 senza convertirlo in stringa o 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); 
... 

Esiste una soluzione che posso utilizzare fino a quando questi metodi non vengono implementati?

risposta

46

C'è una soluzione molto più semplice di accedere al corpo come una stringa che non ho visto documentata da nessuna parte:

let body = res.text() 
+3

Wow! Questa soluzione consente in realtà a npm di compilare anche il mio TS! Dove l'hai trovato? –

+1

C'è stato un sacco di prove ed errori, quindi non posso davvero ricordare che ho paura. – StudioLE

1

Non riesco a vedere altre soluzioni prima che il seguente PR viene unita:

Mentre si dispone di un errore di compilazione, il campo può essere utilizzato in fase di esecuzione ...

6

da quando ho trovato questa domanda durante l'esecuzione nello stesso problema (e la documentazione di angolare non viene aggiornato ad oggi) è ora possibile utilizzare:

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

Un'altra soluzione se per qualche motivo siete su una vecchia versione di Angolare 2 è:

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

impostare il responseType di requestoptions. Ciò renderà il metodo response.blob() funzionante.

 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

maggiori informazioni sulle nuove funzionalità: http://restlet.com/company/blog/2016/08/29/whats-new-in-the-http-module-of-angular-2/, non dimenticare di usare subscribe per sfruttare il risultato – bleuscyther

8

Addon to @StudioLE. È possibile utilizzare il metodo json() per restituire i dati come json.

let body = res.json() 
+1

Questo è assolutamente quello che dovrebbe essere usato. Sulla tua risposta 'error', potresti fare' error.json() 'e i dati effettivamente restituiti dall'API saranno disponibili nel modello. – Rexford

+0

Dangit, mi ero dimenticato di usare '.json()' lol grazie per questa risposta, per fortuna ho battuto la testa solo per pochi minuti. –