Angular 2 http.post ()没有发送请求

当我发送一个帖子请求时,角度为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=>{});

这是故意的吗? 如果是的话,有人能解释一下为什么吗? 或者这是一个错误?

97554 次浏览

因为 Http类的 post方法返回一个可观察的值,所以需要订阅它来执行其初始化处理。观察者是懒惰的。

你应该看看这个视频,了解更多细节:

获取方法不需要使用订阅方法,但 post 方法需要订阅。获取和发布样本代码如下。

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

如果希望执行调用,则将 必须订阅返回给返回的可观察值。

另请参阅下面的角度文档“ 使用 HTTP 与后端服务通信”。

开始请求

对于所有的 HttpClient方法,直到您对可观察的方法返回值调用 subscribe(),该方法才开始它的 HTTP 请求。

这对于 所有 HttpClient 方法是正确的。

当一个组件被销毁时,你应该总是取消订阅一个可观察的组件。

HttpClient方法返回的所有可观测数据都是设计为 很冷的。 HTTP 请求的执行是 延期,允许您使用其他操作(如 tapcatchError)扩展可观察到的内容,然后才会发生任何事情。

调用 subscribe()将触发可观察对象的执行,并导致 HttpClient编写并向服务器发送 HTTP 请求。

可以将这些可观察数据看作实际 HTTP 请求的 蓝图

事实上,每个 subscribe()都会启动一个单独的、独立的可观察对象的执行。 订阅两次会导致两个 HTTP 请求。

const req = http.get&lt;Heroes&gt;('/api/heroes');
// 0 requests made - .subscribe() not called.
req.subscribe();
// 1 request made.
req.subscribe();
// 2 requests made.

在一个相关的说明: 异步管自动为您订阅(和取消订阅)。