Angular 2 http.post () не надсилає запит


141

Коли я роблю запит на повідомлення, кутовий 2 http не надсилає цей запит

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

http-повідомлення не надсилається на сервер, але якщо я зробимо запит таким

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

Це призначено і якщо це може хтось мені пояснити, чому? Або це клоп?

Відповіді:


227

Оскільки postметод Httpкласу повертає спостережуване, вам потрібно підписати його для виконання його ініціалізації. Спостережливі ліниві.

Ви повинні переглянути це відео для отримання детальної інформації:


15
@Thiery Не можете переглянути відео, оскільки це лише для членів
Tatarin

49

Ви повинні підписатися на повернуті спостережувані дані, якщо ви хочете, щоб дзвінок виконувався.

Дивіться також документацію Http .

Завжди підписуйтесь!

HttpClientМетод не починає свій запит HTTP , поки ви не викличете підписатися () на спостережуваному повертається цей метод. Це справедливо для всіх HttpClient методів .

У AsyncPipe виписує (і відписується) для вас автоматично.

Всі спостережувані дані, повернуті з HttpClientметодів, холодні за дизайном. Виконання HTTP-запиту відкладається , що дозволяє розширити спостережуване за допомогою додаткових операцій, таких як tapі catchErrorдо того, як щось насправді станеться.

Виклик subscribe(...)запускає виконання спостережуваного і викликає HttpClientскладання та відправлення HTTP-запиту на сервер.

Ви можете вважати ці спостереження як креслення для фактичних HTTP-запитів.

Фактично, кожен subscribe()ініціює окреме, незалежне виконання спостережуваного. Двічі підписка призводить до двох 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.

41

Метод Get не вимагає використання методу підписки, але метод публікації вимагає підписатися. Отримати та розмістити зразки кодів нижче.

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();
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.