angular4 +如何更改httpClient返回体?

时间:2018-03-30 07:13:22

标签: angular rxjs

我希望rxjs observable只返回数据,所以我想使用HttpInterceptor来改变HttpResponse的主体。代码是

@Injectable()
export class NodeInterceptor implements HttpInterceptor {
intercept(
  req: HttpRequest<any>,
  next: HttpHandler
): Observable<HttpEvent<any>> {
  return next.handle(req).map(event => {
    if (event instanceof HttpResponse) {
      console.log(event);
      if (event.status === 200) {
        event.body = event.body.result;
      }
    }
    return event;
  });
} }

但显示身体无法改变,我该怎么做?

1 个答案:

答案 0 :(得分:1)

让HttpInterceptor完成它应该做的事情,你不需要修改HttpInterceptor来返回Angular中的ResponseMessages。

这是您从Api im Angular捕获响应消息的方法。

在您的service.ts

 add(obj: Model): Observable<Model> {

        return this.http
        .post(this.url, item, { responseType: 'text' });

    }

在您的组件中

 this.service.add(this.obj).subscribe(
        (value) => { this.response = value },
        (error) => { },
        () => {

            if (this.response === "Data saved successfully.") {
                // here you receive Response message.
            }

        });

希望这有帮助。

<强>更新: 您可以创建Generic HttpService并从所有组件中调用它。

@Injectable()

导出类ApiServices {

url: string;

constructor(private http: HttpClient, config: APIConfig) {

    this.url = config.server + config.apiUrl;

}

public getAll(type: string): Observable<T[]> {

    return this.http
        .get(this.url + type)
            .map((res: any) => res);
}


public get<T>(type:string, id?: number): Observable<T> {

    return this.http
        .get<T>(this.url);
}


public add<T>(type:string, item: T): Observable<any> {

    return this.http
        .post(this.url + type, item, { responseType: 'text' });
}

public update<T>(type: string, item: T): Observable<any> {

    return this.http
        .put(this.url + type, JSON.stringify(item), { responseType: 'text' });
}

public delete<T>(id: number) {

    return this.http
        .delete <T>(this.url);
}

}