发表于: 2021-03-23 21:15:09

1 943


今天完成的事情:

使用 HTTP 与后端服务进行通信

HTTP 客户端服务主要功能:

请求类型化响应对象的能力

简化的错误处理

各种特性的可测试性

请求和响应的拦截机制


服务器通讯的准备工作

使用 HttpClient,要先导入 Angular 的 HttpClientModule。在app.module.ts中

import { HttpClientModule } from '@angular/common/http';

@NgModule({
  imports: [
    BrowserModule,
    // import HttpClientModule after BrowserModule.
    HttpClientModule,
  ],
  declarations: [
    AppComponent,
  ],
  bootstrap: [ AppComponent ]
})
export class AppModule {}


把 HttpClient 服务注入成一个应用类的依赖项,在服务config.service.ts 

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class ConfigService {
  constructor(private httpHttpClient) { }
}

HttpClient 服务使用可观察对象。导入范例代码片段中出现的 RxJS 可观察对象和操作符

import { ObservablethrowError } from 'rxjs';
import { catchErrorretry } from 'rxjs/operators';


从服务器请求数据

showConfig() {
  this.configService.getConfig()
    .subscribe((dataConfig=> this.config = {
        heroesUrl: data.heroesUrl,
        textfile:  data.textfile
    });
}


请求输入一个类型的响应

config.service.ts中

getConfig() {
  return this.http.get<Config>(this.configUrl);
}

config.component.ts 中

configConfig;

showConfig() {
  this.configService.getConfig()
    .subscribe((dataConfig=> this.config = { ...data });
}


读取完整的响应体

showConfigResponse() {
  this.configService.getConfigResponse()
    // resp is of type `HttpResponse<Config>`
    .subscribe(resp => {
      // display its headers
      const keys = resp.headers.keys();
      this.headers = keys.map(key =>
        `${key}${resp.headers.get(key)}`);

      // access the body directly, which is typed as `Config`.
      this.config = { ... resp.body };
    });
}


发起 JSONP 请求

当服务器不支持 CORS 协议时,应用程序可以使用 HttpClient 跨域发出 JSONP 请求。

Angular 的 JSONP 请求会返回一个 Observable

searchHeroes(termstring): Observable {
  term = term.trim();

  const heroesURL = `${this.heroesURL}?${term}`;
  return this.http.jsonp(heroesUrl'callback').pipe(
      catchError(this.handleError('searchHeroes', [])) // then handle the error
    );
}


请求非 JSON 数据

getTextFile(filenamestring) {
  // The Observable returned by get() is of type Observable<string>
  // because a text response was specified.
  // There's no need to pass a <string> type parameter to get().
  return this.http.get(filename, {responseType: 'text'})
    .pipe(
      tap// Log the result or error
        data => this.log(filenamedata),
        error => this.logError(filenameerror)
      )
    );
}


问题:

未完成,看不懂范例


明天计划:

继续学习http服务


返回列表 返回列表
评论

    分享到