Szukaj…


Uwagi

Zgłaszanie żądań API za pomocą usługi Angular 2 Http i RxJS jest bardzo podobne do pracy z obietnicami w Angular 1.x.

Do tworzenia żądań używaj klasy Http . Klasa Http udostępnia metody wysyłania żądań HTTP GET , POST , PUT , DELETE , PATCH , HEAD za pomocą odpowiednich metod. Udostępnia także ogólną metodę request do wysyłania dowolnego rodzaju żądania HTTP.

Wszystkie metody klasy Http zwracają Observable<Response> , do której można zastosować operacje RxJS . .subscribe() metodę .subscribe() i przekazujesz funkcję, która ma być wywoływana, gdy dane są zwracane w strumieniu Observable.

Strumień obserwowalny dla żądania zawiera tylko jedną wartość - Response i kończy / rozlicza się, gdy żądanie HTTP zostanie pomyślnie zakończone, lub błędy / usterki, jeśli zostanie zgłoszony błąd.

Uwaga: obserwowalne zwracane przez moduł Httpzimne , co oznacza, że jeśli subskrybujesz obserwowalne wiele razy, pierwotne żądanie zostanie wykonane raz dla każdej subskrypcji. Może się tak zdarzyć, jeśli chcesz wykorzystać wynik w wielu składnikach aplikacji. W przypadku żądań GET może to powodować dodatkowe żądania, ale może to spowodować nieoczekiwane wyniki, jeśli subskrybujesz więcej niż jeden raz żądania PUT lub POST.

Podstawowe zapytanie

Poniższy przykład demonstruje proste żądanie HTTP GET. http.get() zwraca wartość Observable która ma metodę subscribe . Ten dołącza zwrócone dane do tablicy posts .

var posts = []

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

Hermetyzowane żądania API

Dobrym pomysłem może być enkapsulacja logiki obsługi HTTP we własnej klasie. Poniższa klasa przedstawia metodę pobierania postów. http.get() metodę http.get() i wywołuje .map na zwróconym polu Observable celu przekształcenia obiektu Response obiekt 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)
      });
  }
}

W poprzednim przykładzie użyto klasy Post do przechowywania zwróconych danych, które mogą wyglądać następująco:

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;
  }
}

Komponent może teraz używać klasy BlogApi do łatwego pobierania danych Post bez BlogApi się działaniem klasy Http .

Poczekaj na wiele żądań

Jednym z typowych scenariuszy jest oczekiwanie na zakończenie szeregu żądań przed kontynuowaniem. Można to osiągnąć za pomocą metody forkJoin .

W poniższym przykładzie forkJoin jest używany do wywoływania dwóch metod, które zwracają Observables . .subscribe zwrotne określone w metodzie .subscribe zostanie wywołane, gdy oba obserwowalne zakończą się. Parametry .subscribe przez .subscribe zgodne z kolejnością podaną w wywołaniu do .forkJoin . W takim przypadku najpierw posts a następnie 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow