angular - 从 HttpModule 转换为 HttpClientModule

标签 angular http rxjs reactivex angular-httpclient

Angular 正在从 HttpModule 转换为 HttpClientModule 并弃用前者,详见 Difference between HTTP and HTTPClient in angular 4? .

但是 Angular 教程位于 https://angular.io/tutorial/toh-pt6使用 HttpModule,而基本信息位于 https://angular.io/guide/http使用 HttpClientModule,详见 https://github.com/angular/angular/issues/19280 .本教程使用内存服务器,而基础知识使用真实的 Web 服务器,这使得比较变得更加困难。

我尝试使用真实的 Web 服务器在 Angular 教程代码中从 HttpModule 切换到 HttpClientModule,并使某些部分工作但其他部分不工作。从

更改 hero.services.ts 中的 getHeroes 方法之一似乎可行
  getHeroes(): Promise<Hero[]> {
    return this.http.get(this.heroesUrl)
      .toPromise()
      .then(response => response.json().data as Hero[])
      .catch(this.handleError);
  }

  getHeroes(): Promise<Hero[]> {
    return this.httpClient.get(this.heroesUrl)
      .toPromise()
      .then(data => data['heroes'] as Hero[])
      .catch(this.handleError);
  }

尽管可能有改进的方法,而且这个版本可能存在我尚未发现的问题。

但我在 hero-search.service.ts 中没有看到与搜索方法等效的方法

  search(term: string): Observable<Hero[]> {
    return this.http
      .get(`api/heroes/?name=${term}`)
      .map(response => response.json().data as Hero[]);
  }

应该可以省去 map,但是你不能使用与上面相同的方法,因为有一个 Observable 而不是 Promise,你会得到如下错误:

Type 'Observable<Object>' is not assignable to type 'Observable<Hero[]>'.

有没有人将Angular教程中的Heroes demo转换为使用HttpClientModule或者知道如何转换上面的搜索代码?

最佳答案

虽然 HttpClient 将 JSON 响应解析为对象,但它不知道该对象的形状。因此,您可以指定响应的类型:

return this.http
    .get<{ data: Hero[] }>(`api/heroes/?name=${term}`)
    .map(res => res.data);

请注意,您可以为此创建接口(interface):

interface ItemsResponse {
  data: Hero[];
}

return this.http
  .get<ItemsResponse>(`api/heroes/?name=${term}`)
  .map(res => res.data);

如果您怀疑什么类型的响应将是或不想创建接口(interface),那么只需使用any:

return this.http
  .get<any>(`api/heroes/?name=${term}`)
  .map(res => res.data);

TOH-HttpClientModule Example

另见

关于angular - 从 HttpModule 转换为 HttpClientModule,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46331474/

相关文章:

angular - 如何定期更新 map 框要素坐标

angular - 如何在 Angular 8 中将动态值传递给管道

angular - Docker的Apache CORS header

java - 在 Java 中处理 HTTP 调用的大文件

angular - 在 Angular Directive(指令)组件之外调用函数

java - 如何使用spring的MockMultipartHttpServletRequest?获取 "no multipart boundary was found"

angular - 通过从 Angular 客户端到 NestJS 服务器的 Http 请求,数字转换为字符串

javascript - 在 Angular 5 中,如何对点击事件进行分组并仅在用户停止点击时发出一次

javascript - Angular rxjs 去抖以限制用户发送多个请求

javascript - 在 rxjs 中实现 fromSubscriber