Angular 2 的 http.post() 方法没有发送请求
Angular 2 的 http.post() 方法没有发送请求
当我发送一个post请求时,angular 2的http不会发送这个请求。
this.http.post(this.adminUsersControllerRoute, JSON.stringify(user), this.getRequestOptions())
http的post请求没有发送到服务器,但是如果我像这样发送请求
this.http.post(this.adminUsersControllerRoute, JSON.stringify(user), this.getRequestOptions()).subscribe(r=>{});
这是故意的吗?如果是的话,有人能解释一下为什么吗?还是这是一个bug?
Angular 2 http.post() is not sending the request的问题出现的原因是post方法需要使用subscribe方法,而get方法不需要。解决方法是在http.post()方法后面添加.subscribe()。
以下是解决方法的代码:
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(); // Add subscribe method to send the request }
这样就可以解决Angular 2 http.post() is not sending the request的问题了。
在使用Angular 2的http.post()方法发送请求时,出现了请求没有发送的问题。解决这个问题的方法是需要订阅返回的Observable对象,这样才能执行调用。
根据Angular文档中的说明,对于所有的HttpClient方法,在调用subscribe()方法之前,方法不会发起HTTP请求。这适用于所有的HttpClient方法。
同时,我们需要在组件销毁的时候取消订阅Observable对象。
所有从HttpClient方法返回的Observable对象都是"cold"的,这是设计时的考虑。HTTP请求的执行是延迟的,这样可以让我们在实际发起请求之前,通过扩展Observable对象进行其他操作,比如使用tap和catchError方法。只有调用subscribe()方法才会触发Observable的执行,并导致HttpClient组合并发送HTTP请求到服务器上。
可以把这些Observable对象看作是实际HTTP请求的"蓝图"。
另外,每次调用subscribe()方法都会独立执行一个Observable对象,因此订阅两次会发起两个HTTP请求。
在相关的说明中,我们还了解到AsyncPipe会自动订阅和取消订阅Observable对象。
Angular 2的http.post()
方法未发送请求的原因是因为需要订阅(subscribe)它返回的observable以执行初始化处理。Observables是惰性的。
解决方法是在http.post()
方法后面添加.subscribe()
来订阅这个observable。
以下是一个示例代码:
http.post(url, data) .subscribe(response => { // 处理响应数据 }, error => { // 处理错误 });
如果忘记订阅observable,请求将不会发送。
你可以查看这个视频了解更多细节:https://egghead.io/lessons/rxjs-rxjs-observables-vs-promises(需要会员才能观看)。