Recherche…


Remarques

Faire des requêtes API avec le service HTTP Angular 2 et RxJS est très similaire à travailler avec des promesses dans Angular 1.x.

Utilisez la classe Http pour faire des requêtes. La classe Http expose les méthodes d'émission des requêtes HTTP GET , POST , PUT , DELETE , PATCH , les requêtes HEAD via les méthodes correspondantes. Il expose également une méthode de request générique pour émettre tout type de requête HTTP.

Toutes les méthodes de la classe Http renvoient une Observable<Response> à laquelle vous pouvez appliquer des opérations RxJS . Vous appelez la méthode .subscribe() et transmettez une fonction à appeler lorsque des données sont renvoyées dans le flux Observable.

Le flux observable pour une requête ne contient qu'une seule valeur: la Response , et se termine / se règle lorsque la requête HTTP est terminée avec succès ou en cas d'erreur ou d'erreur en cas d'erreur.

Notez que les observables renvoyées par le module Http sont froides , ce qui signifie que si vous vous abonnez à l'observable plusieurs fois, la requête d'origine sera exécutée une fois pour chaque abonnement. Cela peut se produire si vous souhaitez consommer le résultat dans plusieurs composants de votre application. Pour les requêtes GET, cela peut provoquer des requêtes supplémentaires, mais cela peut créer des résultats inattendus si vous vous abonnez plus d'une fois à des requêtes PUT ou POST.

Demande de base

L'exemple suivant illustre une simple requête HTTP GET. http.get() renvoie un objet Observable auquel la méthode est subscribe . Celui-ci ajoute les données renvoyées au tableau des posts .

var posts = []

getPosts(http: Http):void {
    this.http.get(`https://jsonplaceholder.typicode.com/posts`)
        .map(response => response.json())
        .subscribe(post => posts.push(post));
}

Encapsulation des requêtes API

Il peut être judicieux d’encapsuler la logique de gestion HTTP dans sa propre classe. La classe suivante expose une méthode pour obtenir des messages. Il appelle la méthode http.get() et appelle .map sur l' Observable renvoyé pour convertir l'objet Response objet Post .

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

@Injectable()
export class BlogApi {

  constructor(private http: Http) {
  }

  getPost(id: number): Observable<Post> {
    return this.http.get(`https://jsonplaceholder.typicode.com/posts/${id}`)
      .map((response: Response) => {
        const srcData = response.json();
        return new Post(srcData)
      });
  }
}

L'exemple précédent utilise une classe Post pour contenir les données renvoyées, qui peuvent ressembler à ceci:

export class Post { 
  userId: number;
  id: number;
  title: string;
  body: string;

  constructor(src: any) {
      this.userId = src && src.userId;
      this.id = src && src.id;
      this.title = src && src.title;
      this.body = src && src.body;
  }
}

Un composant peut maintenant utiliser la classe BlogApi pour récupérer facilement des données Post sans se préoccuper du fonctionnement de la classe Http .

Attendez plusieurs demandes

Un scénario courant consiste à attendre que plusieurs requêtes se terminent avant de continuer. Cela peut être accompli en utilisant la méthode forkJoin .

Dans l'exemple suivant, forkJoin est utilisé pour appeler deux méthodes qui renvoient des Observables . Le rappel spécifié dans la méthode .subscribe sera appelé lorsque les deux observables seront terminés. Les paramètres fournis par .subscribe correspondent à l'ordre donné dans l'appel à .forkJoin . Dans ce cas, posts abord posts tags .

loadData() : void {
    Observable.forkJoin(
        this.blogApi.getPosts(),
        this.blogApi.getTags()
    ).subscribe((([posts, tags]: [Post[], Tag[]]) => {
        this.posts = posts;
        this.tags = tags;
    }));
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow