Angular 2 http.post () não está enviando a solicitação

140

Quando faço uma solicitação de postagem, o http angular 2 não está enviando essa solicitação

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

a postagem http não é enviada ao servidor, mas se eu fizer a solicitação assim

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

Isso é pretendido e, se for, alguém pode me explicar o porquê? Ou é um bug?

Nicu
fonte

Respostas:

226

Como o postmétodo da Httpclasse retorna um observável, é necessário assiná-lo para executar seu processamento de inicialização. Observáveis ​​são preguiçosos.

Você deve dar uma olhada neste vídeo para obter mais detalhes:

Thierry Templier
fonte
15
@Thiery não pode assistir o vídeo, uma vez que é apenas para membros
Tatarin
47

Você deve assinar o observável retornado se desejar que a chamada seja executada.

Veja também a documentação Http .

Sempre se inscreva!

Um HttpClientmétodo não inicia sua solicitação HTTP até você chamar subscribe () no observável retornado por esse método. Isso vale para todos os HttpClient métodos .

O AsyncPipe assina (e cancela a inscrição) automaticamente.

Todos os observáveis ​​retornados dos HttpClientmétodos são frios por design. A execução da solicitação HTTP é adiada , permitindo que você estenda o observável com operações adicionais como tape catchErrorantes que algo realmente aconteça.

A chamada subscribe(...)aciona a execução do observável e faz HttpClientcom que componha e envie a solicitação HTTP para o servidor.

Você pode pensar nesses observáveis ​​como blueprints para solicitações HTTP reais.

De fato, cada subscribe()um inicia uma execução separada e independente do observável. A inscrição duas vezes resulta em duas solicitações 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
fonte
41

O método Get não requer o uso do método de inscrição, mas o método post exige a inscrição. Obter e postar códigos de amostra estão abaixo.

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
fonte