【问题标题】:Http post and get request in angular 6Angular 6 中的 Http 发布和获取请求
【发布时间】:2018-10-16 04:50:46
【问题描述】:

在 angular 5.2.x for http get and post 我有这个代码:

post(url: string, model: any): Observable<boolean> {

return this.http.post(url, model)
  .map(response => response)
  .do(data => console.log(url + ': ' + JSON.stringify(data)))
  .catch(err => this.handleError(err));
 }
 get(url: string): Observable<any> {

return this.http.get(url)
  .map(response => response)
  .do(data =>
    console.log(url + ': ' + JSON.stringify(data))
  )
  .catch((error: any) => Observable.throw(this.handleError(error)));
 }

在 Angular 6 中它不起作用。

我们如何进行 HTTP 发布或获取请求?

【问题讨论】:

标签: httprequest observable angular6


【解决方案1】:

要在 Angular 中阅读完整响应,您应该添加观察选项:

{ observe: 'response' }
    return this.http.get(`${environment.serverUrl}/api/posts/${postId}/comments/?page=${page}&size=${size}`, { observe: 'response' });

【讨论】:

    【解决方案2】:

    您可以使用一个库进行发布/获取,该库允许您将 HttpClient 与强类型回调一起使用

    数据和错误可直接通过这些回调获得。

    该库名为 angular-extended-http-client

    angular-extended-http-client library on GitHub

    angular-extended-http-client library on NPM

    非常容易使用。

    传统方法

    在传统方法中,您从 Service API 返回 ObservableHttpResponse<T&gt;>。这与 HttpResponse 相关。

    使用这种方法,您必须在其余代码中使用 .subscribe(x => ...)

    这会在 http 层您的代码的其余部分 之间创建紧密耦合

    强类型回调方法

    您只在这些强类型回调中处理您的模型。

    因此,您的其余代码只知道您的模型。

    示例用法

    强类型回调是

    成功:

    • IObservableT>
    • IObservableHttpResponse
    • IObservableHttpCustomResponseT>

    失败:

    • IObservableErrorTError>
    • IObservableHttpError
    • IObservableHttpCustomErrorTError>

    将包添加到您的项目和应用模块中

    import { HttpClientExtModule } from 'angular-extended-http-client';
    

    在@NgModule 导入中

      imports: [
        .
        .
        .
        HttpClientExtModule
      ],
    

    你的模型

    
    export class SearchModel {
        code: string;
    }
    
    //Normal response returned by the API.
    export class RacingResponse {
        result: RacingItem[];
    }
    
    //Custom exception thrown by the API.
    export class APIException {
        className: string;
    }
    

    您的服务

    在您的服务中,您只需使用这些回调类型创建参数。

    然后,将它们传递给 HttpClientExt 的 get 方法。

    import { Injectable, Inject } from '@angular/core'
    import { SearchModel, RacingResponse, APIException } from '../models/models'
    import { HttpClientExt, IObservable, IObservableError, ResponseType, ErrorType } from 'angular-extended-http-client';
    .
    .
    
    @Injectable()
    export class RacingService {
    
        //Inject HttpClientExt component.
        constructor(private client: HttpClientExt, @Inject(APP_CONFIG) private config: AppConfig) {
    
        }
    
        //Declare params of type IObservable<T> and IObservableError<TError>.
        //These are the success and failure callbacks.
        //The success callback will return the response objects returned by the underlying HttpClient call.
        //The failure callback will return the error objects returned by the underlying HttpClient call.
        searchRaceInfo(model: SearchModel, success: IObservable<RacingResponse>, failure?: IObservableError<APIException>) {
            let url = this.config.apiEndpoint;
    
            this.client.post<SearchModel, RacingResponse>(url, model, 
                                                          ResponseType.IObservable, success, 
                                                          ErrorType.IObservableError, failure);
        }
    }
    

    你的组件

    在您的组件中,注入您的服务并调用 searchRaceInfo API,如下所示。

      search() {    
    
    
        this.service.searchRaceInfo(this.searchModel, response => this.result = response.result,
                                                      error => this.errorMsg = error.className);
    
      }
    

    回调中返回的 responseerror 都是强类型的。例如。 responseRacingResponse 类型,errorAPIException

    【讨论】:

      【解决方案3】:

      更新: 在 Angular 7 中,它们与 6 相同

      在角度 6

      完整答案在live example

        /** POST: add a new hero to the database */
        addHero (hero: Hero): Observable<Hero> {
       return this.http.post<Hero>(this.heroesUrl, hero, httpOptions)
        .pipe(
          catchError(this.handleError('addHero', hero))
        );
      }
        /** GET heroes from the server */
       getHeroes (): Observable<Hero[]> {
      return this.http.get<Hero[]>(this.heroesUrl)
        .pipe(
          catchError(this.handleError('getHeroes', []))
        );
      }
      

      这是因为 pipeable/lettable operators 现在 angular 能够使用 tree-shakable 并删除未使用的导入并优化应用程序

      部分 rxjs 功能发生变化

      do -> tap
      catch -> catchError
      switch -> switchAll
      finally -> finalize
      

      更多MIGRATION

      和导入路径

      对于 JavaScript 开发者来说,一般规则如下:

      rxjs:创建方法、类型、调度程序和实用程序

      import { Observable, Subject, asapScheduler, pipe, of, from, interval, merge, fromEvent } from 'rxjs';
      

      rxjs/operators:所有可管道操作符:

      import { map, filter, scan } from 'rxjs/operators';
      

      rxjs/webSocket:web socket 主题实现

      import { webSocket } from 'rxjs/webSocket';
      

      rxjs/ajax:Rx ajax 实现

      import { ajax } from 'rxjs/ajax';
      

      rxjs/testing:测试工具

      import { TestScheduler } from 'rxjs/testing';
      

      为了向后兼容,您可以使用rxjs-compat

      【讨论】:

      • 如果您能在此处重复链接内容的要点,将会有所帮助。只是为了保持这个问答的独立性,不易受到链接腐烂的影响。
      • RxJS v6 的链接ReactiveX/rxjs
      • Angular 6 中的 AJAX 调用和 http.post/get 调用有什么区别吗?
      • @UmeshPatadiya 不,它们是一样的。因为 http.post/get .. 正在使用 XMLHttpRequest 接口。 angular.io/guide/http
      • 有什么方法可以更快地响应 http.post/get 请求?
      猜你喜欢
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 2019-11-17
      • 2022-02-07
      • 1970-01-01
      • 2018-11-28
      • 2016-11-17
      • 1970-01-01
      相关资源
      最近更新 更多