Angular 2 http.post () nie wysyła żądania

141

Kiedy wysyłam żądanie posta, kątowy 2 http nie wysyła tego żądania

this.http.post(this.adminUsersControllerRoute, JSON.stringify(user), this.getRequestOptions())

post http nie jest wysyłany do serwera, ale jeśli wykonam żądanie w ten sposób

this.http.post(this.adminUsersControllerRoute, JSON.stringify(user), this.getRequestOptions()).subscribe(r=>{});

Czy jest to zamierzone i jeśli tak, może ktoś mi wytłumaczyć dlaczego? Czy to błąd?

Nicu
źródło

Odpowiedzi:

227

Ponieważ postmetoda Httpklasy zwraca obserwowalne, musisz ją zasubskrybować, aby wykonać przetwarzanie inicjalizacji. Observable są leniwe.

Aby uzyskać więcej informacji, obejrzyj ten film:

Thierry Templier
źródło
15
@Thiery Nie mogę obejrzeć filmu, ponieważ jest on przeznaczony tylko dla
wspierających
49

Musisz zasubskrybować zwracaną obserwowalną, jeśli chcesz, aby wywołanie zostało wykonane.

Zobacz także dokumentację HTTP .

Zawsze subskrybuj!

HttpClientMetoda nie rozpoczyna swojego żądania HTTP do czasu wywołania subskrybować () na obserwowalne zwrócony przez tę metodę. Dotyczy to wszystkich HttpClient metod .

W AsyncPipe subskrybuje (i unsubscribes) automatycznie.

Wszystkie obserwowalne zwrócone z HttpClientmetod są zimne z założenia. Wykonanie żądania HTTP jest odroczone , co pozwala rozszerzyć obserwowalne o dodatkowe operacje, takie jak tapi catchErrorzanim cokolwiek się stanie.

Wywołanie subscribe(...)wyzwala wykonanie obserwowalnego i powoduje HttpClientutworzenie i wysłanie żądania HTTP do serwera.

Możesz myśleć o tych obserwowalnych jako o planach rzeczywistych żądań HTTP.

W rzeczywistości każdy subscribe()inicjuje oddzielne, niezależne wykonanie tego, co obserwowalne. Dwukrotna subskrypcja skutkuje dwoma żądaniami HTTP.

content_copy
const req = http.get<Heroes>('/api/heroes');
// 0 requests made - .subscribe() not called.
req.subscribe();
// 1 request made.
req.subscribe();
// 2 requests made.
Igor
źródło
41

Metoda Get nie wymaga użycia metody subscribe, ale metoda post wymaga subskrypcji. Pobierz i wyślij przykładowe kody poniżej.

import { Component, OnInit } from '@angular/core'
import { Http, RequestOptions, Headers } from '@angular/http'
import 'rxjs/add/operator/map'
import 'rxjs/add/operator/catch'
import { Post } from './model/post'
import { Observable } from "rxjs/Observable";

@Component({
    templateUrl: './test.html',
    selector: 'test'
})
export class NgFor implements OnInit {

    posts: Observable<Post[]>
    model: Post = new Post()

    /**
     *
     */
    constructor(private http: Http) {

    }

    ngOnInit(){
        this.list()
    }

    private list(){
        this.posts = this.http.get("http://localhost:3000/posts").map((val, i) => <Post[]>val.json())
    }

    public addNewRecord(){
        let bodyString = JSON.stringify(this.model); // Stringify payload
        let headers      = new Headers({ 'Content-Type': 'application/json' }); // ... Set content type to JSON
        let options       = new RequestOptions({ headers: headers }); // Create a request option

        this.http.post("http://localhost:3000/posts", this.model, options) // ...using post request
                         .map(res => res.json()) // ...and calling .json() on the response to return data
                         .catch((error:any) => Observable.throw(error.json().error || 'Server error')) //...errors if
                         .subscribe();
    }
}
Murat ÖNER
źródło