http - 如何在 Angular 2 中进行 API 调用?

标签 http angular

那里已经有很多资源,但出于某种原因我一直无法找到有效的资源。举一个通用的例子:我想从 http://swapi.co/api/people 得到响应,这将是《星球大战》中人物的列表。

import {Injectable } from '@angular/core';
import {Http, Response} from '@angular/http';
import {Observable} from 'rxjs/Observable';

import 'rxjs/add/operator/map';

@Injectable()
export class OombaDataService {
    constructor(private http: Http) {}
    private usersUrl = 'http://swapi.co/api/people/';

    getData() {
        return this.http.get(this.usersUrl)
        .map(this.extractData)
    }

    private extractData(res: Response) {
        let body = res.json();
        return body.data || { };
    }
    private handleError (error: any) {
      // In a real world app, we might use a remote logging infrastructure
      // We'd also dig deeper into the error to get a better message
      let errMsg = (error.message) ? error.message :
                   error.status ? `${error.status} - ${error.statusText}` : 'Server error';
      console.error(errMsg); // log to console instead
      return Observable.throw(errMsg);
    }
}

其中很多内容应该是正确的,因为它基于 Angular 自己的 tutorial就此事。但无论出于何种原因,当我在我的组件中调用它时,它只返回一个没有 JSON 数据的可观察对象。我错过了什么?

最佳答案

在这个方法中:

private extractData(res: Response) {
    let body = res.json();
    return body.data || { };
}

在第一行,您将 API 调用的结果作为 JSON 解析为 JavaScript 对象。 然后你返回属性 data该对象的,如果它存在。如果不存在,则返回一个空对象 ( { } )。

问题在于 http://swapi.co/api/people/ 处的 API不会带来包含 data 的响应属性,这意味着 extractData()方法总是返回空对象的可观察对象 ( { } )。

除此之外,getData()真的返回一个 Observable ,所以要得到它的值,就必须订阅它,比如:

@Component({
  ...
  providers: [OombaDataService]
})
export class SomeComponent {

  constructor(oombaDataService: OombaDataService) {
    oombaDataService.getData().subscribe(
      x => {
          console.log("VALUE RECEIVED: ",x);
      },
      x => {
          console.log("ERROR: ",x);
      },
      () => {
          console.log("Completed");
      }
    );
  }

}

并且,因为如前所述,API 的响应没有任何 .data其中的属性,extractData()真的应该是(至少在你弄清楚你想要什么之前):

private extractData(res: Response) {
    return res.json();
}

这应该能让事情正常进行。这是一个 working plunker .

关于http - 如何在 Angular 2 中进行 API 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38679735/

相关文章:

http - 如果没有可用连接,黑莓 HTTP 请求是否会立即出错?

ruby-on-rails - Rails 请求返回状态 200 但没有响应数据

javascript - 从外部源接收数据后如何刷新 ng-repeat

rest - 为什么我的请求方法 GET 不受支持?

angular - 如何遍历 rxjs 过滤器运算符中的子类别

css - 使 ionic 卡/ ionic 幻灯片位于 ionic 移动应用程序中的谷歌地图之上

http - 来自同一 session 的多个请求如何始终落在同一台服务器上?

javascript - 找不到名称 'module'

angular - 我可以将 Typescript 与 Angular 2.0 结合使用,还是应该使用 Traceur?

Angular PWA 哈希文件缓存问题