51 votes

Angular 2 : Comment accéder à un corps de réponse HTTP ?

J'ai écrit le code suivant en Angular 2 :

this.http.request('http://thecatapi.com/api/images/get?format=html&results_per_page=10').
      subscribe((res: Response) => {
        console.log(res);
      })

Lorsque j'imprime la réponse que j'obtiens dans la console : enter image description here

Je veux avoir accès dans le code au champ "body" de la réponse. Le champ 'body' commence par un trait de soulignement, ce qui signifie que c'est un champ privé. Lorsque je le change en 'console.log(res._body)', j'obtiens une erreur.

Connaissez-vous une fonction getter qui pourrait m'aider ici ?

0 votes

Voir ici, stackoverflow.com/a/44622319/2803344 alors vous pouvez utiliser res.json().results pour obtenir le tableau retourné.

63voto

OrangeDog Points 7380

Les deux sites Request y Response étendre Body . Pour obtenir le contenu, utilisez la commande text() méthode.

this.http.request('http://thecatapi.com/api/images/get?format=html&results_per_page=10')
    .subscribe(response => console.log(response.text()))

Cette API a été dépréciée dans Angular 5. La nouvelle HttpResponse<T> a plutôt un .body() méthode. Avec un {responseType: 'text'} qui devrait retourner un String .

2 votes

Respone.text(), le compilateur lui-même se plaint que text() n'existe pas pour l'objet.

0 votes

Veuillez répondre à @Jess

0 votes

@Jess peut-être n'utilisez-vous pas Angular 2 ?

20voto

vishnu Points 434

Voici un exemple pour accéder au corps de la réponse en utilisant angular2 intégré Réponse

import { Injectable } from '@angular/core';
import {Http,Response} from '@angular/http';

@Injectable()
export class SampleService {
  constructor(private http:Http) { }

  getData(){

    this.http.get(url)
   .map((res:Response) => (
       res.json() //Convert response to JSON
       //OR
       res.text() //Convert response to a string
   ))
   .subscribe(data => {console.log(data)})

  }
}

11voto

SrAxi Points 8077

Voici un exemple de get Appel http :

this.http
  .get('http://thecatapi.com/api/images/get?format=html&results_per_page=10')
  .map(this.extractData)
  .catch(this.handleError);

private extractData(res: Response) {
   let body = res.text();  // If response is a JSON use json()
   if (body) {
       return body.data || body;
    } else {
       return {};
    }
}

private handleError(error: any) {
   // In a real world app, we might use a remote logging infrastructure
   // We'd also dig deeper into the error to get a better message
   let errMsg = (error.message) ? error.message :
   error.status ? `${error.status} - ${error.statusText}` : 'Server error';
        console.error(errMsg); // log to console instead
        return Observable.throw(errMsg);
}

Note .get() au lieu de .request() .

Je voulais aussi vous fournir des informations supplémentaires extractData y handleError des méthodes au cas où vous en auriez besoin et que vous ne les ayez pas.

0 votes

J'ai mis à jour ma réponse pour utiliser text() au lieu de json() .

5voto

Dmitrij Kuba Points 669

Les données de la réponse sont sous forme de chaîne JSON. L'application doit analyser cette chaîne en objets JavaScript en appelant response.json().

  this.http.request('http://thecatapi.com/api/images/get?format=html&results_per_page=10').
  .map(res => res.json())
  .subscribe(data => {
    console.log(data);
  })

https://angular.io/docs/ts/latest/guide/server-communication.html#!#extract-data

1 votes

Je reçois une erreur : La propriété 'map' n'existe pas sur le type 'Observable<Response>'.

0 votes

Essayez d'importer 'rxjs/add/operator/map'.

4voto

kind user Points 20108

Ne pouvez-vous pas simplement vous référer à la _body directement ? Apparemment, il ne renvoie aucune erreur s'il est utilisé de cette façon.

this.http.get('https://thecatapi.com/api/images/get?format=html&results_per_page=10')
            .map(res => res)
            .subscribe(res => {
                this.data = res._body;
            });

Plongeur de travail

1 votes

Oui, c'est typiquement la façon dont je le fais. J'ai même vu cette façon de faire dans des cours Pluralsight. Mon choix pour la bonne réponse.

0 votes

Pourquoi utiliser une fonction map qui renvoie son argument ? N'accomplirait-elle pas exactement rien ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X