无法使用 Angular 2 rc5 发出 http 请求

Posted

技术标签:

【中文标题】无法使用 Angular 2 rc5 发出 http 请求【英文标题】:Unable to make http request with Angular 2 rc5 【发布时间】:2016-12-18 22:29:30 【问题描述】:

我刚刚升级到Angular 2 RC 5,由于我不知道的原因,我无法发出任何 http 请求(即从未发出过请求/不会出现在浏览器日志中)。

这是在今天升级之前有效的代码。

console.log("Let's call github");
let url = 'https://raw.githubusercontent.com/angular/angular/master/LICENSE';
return this.get(url).do(d=>console.log('success'));

当我的组件调用包含此代码的函数时,会输出Let's call github,但随后不会发出请求。我确信来自@angular/httpObservableHttp 已正确导入,因为今天早上同样的代码有效。我的第一个想法是我错过了HttpModule,但我已经确认我将它导入到我的主要AppModule

事实上,如果我注释掉 HttpModule 导入,我可以看到它没有任何区别。错误是一样的,如下:

Exception: TypeError: this._body is null

这是堆栈跟踪的摘录(底部是调用上面引用的函数的行):

【问题讨论】:

【参考方案1】:

2016 年 8 月 12 日更新

此问题已得到解决,可能会在下一个版本中修复。当前的解决方法是跳过 GET 请求上的 content-type 设置,或将 body='' 显式设置为请求选项。

链接:Gihub discussion

原答案

错误似乎与我在每个 http 请求之前运行的函数中的代码块有关。因为我与之交互的 API 需要 JSON 内容,所以我有以下内容(options 指的是用于每个请求的 RequestOptions 对象):

//set content to JSON
if(!options.headers.has("Content-Type"))
    options.headers.append("Content-Type", "application/json")

如果我注释掉这些行,则请求成功。所以我在想,从Angular 2 rc 5 开始,如果请求正文为空,这个块会抛出一个错误(就像我来自 OP 的get 请求一样)。

如果我的直觉是正确的,这种行为变化是由this commit 引起的(rc 5 的新手)

fix(http):将传递给请求的对象转换成字符串

我敢打赌,当我设置内容类型标头时,Angular 会尝试为我提供帮助并将请求正文字符串化。当然没有GET,因此错误。

【讨论】:

以上是关于无法使用 Angular 2 rc5 发出 http 请求的主要内容,如果未能解决你的问题,请参考以下文章

Angular2 RC5:无法绑定到“属性 X”,因为它不是“子组件”的已知属性

Angular 2 RC5:没有路由器提供者

Angular 2,RC5 路由器插座在另一个路由器插座内

Angular 2 RC5 编写基于模板的表单的方式是啥?

styleUrls 未在 angular2 ChildComponent (RC5) 中加载

Angular2 RC5 ngModule:没有 NameService 的提供者