Buscar..


Observaciones

Hacer solicitudes de API con el servicio Angular 2 Http y RxJS es muy similar a trabajar con promesas en Angular 1.x.

Usa la clase Http para hacer peticiones. La clase Http expone los métodos para emitir solicitudes HTTP GET , POST , PUT , DELETE , PATCH , HEAD a través de los métodos correspondientes. También expone un método de request genérico para emitir cualquier tipo de solicitud HTTP.

Todos los métodos de la clase Http devuelven un Observable<Response> , al que puede aplicar operaciones RxJS . Se llama al método .subscribe() y se pasa una función a la que se llamará cuando se devuelvan datos en el flujo observable.

El flujo observable para una solicitud contiene solo un valor: la Response , y se completa / resuelve cuando la solicitud HTTP se completa con éxito, o errores / fallas si se produce un error.

Tenga en cuenta que los observables devueltos por el módulo Http son fríos , lo que significa que si se suscribe al observable varias veces, la solicitud de origen se ejecutará una vez por cada suscripción. Esto puede suceder si desea consumir el resultado en varios componentes de su aplicación. Para solicitudes GET, esto podría causar algunas solicitudes adicionales, pero esto puede crear resultados inesperados si se suscribe más de una vez a las solicitudes PUT o POST.

Solicitud basica

El siguiente ejemplo muestra una solicitud HTTP GET simple. http.get() devuelve un Observable que tiene el método subscribe . Este anexa los datos devueltos a la matriz de posts .

var posts = []

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

Encapsular las solicitudes de API

Puede ser una buena idea encapsular la lógica de manejo de HTTP en su propia clase. La siguiente clase expone un método para obtener publicaciones. Llama al método http.get() y llama a .map en el Observable devuelto para convertir el objeto Response en un objeto 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)
      });
  }
}

El ejemplo anterior utiliza una clase de Post para contener los datos devueltos, que podrían tener el siguiente aspecto:

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 componente puede ahora utilizar el BlogApi clase para recuperar fácilmente Post de datos sin preocuparse de los trabajos de la Http clase.

Espera múltiples solicitudes

Un escenario común es esperar a que finalicen varias solicitudes antes de continuar. Esto se puede lograr utilizando el método forkJoin .

En el siguiente ejemplo, forkJoin se usa para llamar a dos métodos que devuelven Observables . La devolución de llamada especificada en el método .subscribe se llamará cuando ambos Observables se hayan completado. Los parámetros proporcionados por .subscribe coinciden con el orden dado en la llamada a .forkJoin . En este caso, primero posts luego 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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow