【问题标题】:Angular Response.json() not documentedAngular Response.json() 未记录
【发布时间】:2016-12-24 02:42:08
【问题描述】:

我看到 Response.json() 方法被大量使用,我自己也在使用它,但要么我遗漏了某些东西,要么 Response 类的文档不正确。

例子:

getCurrentTime() {
    return this._http.get('http://date.jsontest.com/')
        .map((res:Response) => res.json())
}

https://angular.io/docs/ts/latest/api/http/index/Response-class.html 的 Angular 站点上,我不认为该方法是 Response 类的成员。

如果 .json 不是 Response 类的成员,有人可以指出我理解其工作原理的方向吗?

或者如果文档有误,请有人说出来。

提前致谢。

【问题讨论】:

    标签: json angular


    【解决方案1】:

    如果您查看API Reference for Response,您会看到Response 扩展了Body。如果您尝试搜索Body,您将找不到它,这可能意味着它不是公开的。如果您查看the source code for Body,您会看到json 的代码

    /**
     * Attempts to return body as parsed `JSON` object, or raises an exception.
     */
    json(): any {
      if (typeof this._body === 'string') {
        return JSON.parse(<string>this._body);
      }
    
      if (this._body instanceof ArrayBuffer) {
        return JSON.parse(this.text());
      }
    
      return this._body;
    }
    

    如果您需要解释来源,请告诉我。不过对我来说它看起来很不言自明。

    【讨论】:

    • 哦,伙计。当然,这是显而易见的。非常感激。我是 Angular2 的新手,所以也不熟悉文档。我很惊讶 API 没有显示继承方法的链接。
    • 也许您也可以向我解释为什么我的问题被否决了。我意识到我忽略了一些可能很明显的事情,但这不是一个合理的问题吗?
    • 我不知道。人们有他们的理由。我无法猜测为什么。我个人认为没有任何问题。我不会回答我投反对票的问题。
    • @BBaysinger,我认为有些不好的人只是为了好玩而投反对票,啊哈,不,我认为只是人们没有仔细阅读您的问题,仅此而已,快乐编码!
    • @BBaysinger 在最新的 Angular 中,它不起作用,你能帮我解决这个问题吗?
    【解决方案2】:

    实际上,HTTP 客户端文档 (Process the response object) 说:

    解析为 JSON

    这不是 Angular 自己的设计。 Angular HTTP 客户端遵循 Fetch 函数返回的响应对象的 Fetch 规范。该规范定义了一个 json() 方法,该方法将响应正文解析为 JavaScript 对象。

    所以 Angular2 实现了 Fetch Specification,其中包括提到的 Body mixin 的规范,Angular2 的 Response 类正在扩展,包括 .json() 方法。

    json() 方法在被调用时,必须返回 JSON 运行消费体的结果。

    正如您在 peeskillet 的链接中看到的,Angular2 正在实现 Body mixin 的所有指定方法,formData() 除外。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,这就是错误消失的方式: 在新版本的Angular 4+中,需要从以下位置导入rxjs:

      import { map } from 'rxjs/operators';
      

      而不是从导入:

      import 'rxjs/add/operator/map';
      

      接下来,将 .get() 更改为 .get() 并且您还必须使用管道用于 Angular 4+,如下所示:

      getCurrentTime() {
          return this._http.get<any>('http://date.jsontest.com/')
              .pipe(map((res:Response) => res.json()));
      }
      

      希望对您有所帮助...!

      【讨论】:

      • 这个问题有点老了。我想请记住,从 Angular 7 开始,http 已经过时了。而使用 httpClient 你需要 not 使用 json。通过缺陷返回一个 json 对象
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      相关资源
      最近更新 更多