import { Injectable } from '@angular/core';
import { HttpHeaders, HttpErrorResponse, HttpClient } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
import { NzMessageService } from 'ng-zorro-antd/message';
@Injectable({
providedIn: 'root'
})
export class HttpService {
constructor(private http: HttpClient, private message: NzMessageService) { }
get<T>(url: string): Observable<T> {
const headers = this.createHeaders('application/json');
return this.http.get<T>(url, { headers }).pipe(
map(this.extractData),
catchError(this.handleError)
);
}
post<T>(url: string, body: any): Observable<T> {
const headers = this.createHeaders('application/json');
return this.http.post<T>(url, body, { headers }).pipe(
map(this.extractData),
catchError(this.handleError)
);
}
postBlob<T>(url: string, body: any): Observable<T> {
const headers = this.createHeaders('application/json');
return this.http.post<T>(url, body, { headers , responseType: 'blob' as 'json' }).pipe(
map(this.extractData),
catchError(this.handleError)
);
}
private createHeaders(contentType?: string): HttpHeaders {
let headers: HttpHeaders = new HttpHeaders();
if (contentType) {
headers = headers.set('Content-Type', contentType);
}
if (this.token) {
headers = headers.set('Authorization', `Bearer ${this.token}`);
}
return headers;
}
private extractData(res: any) {
return res || {};
}
private handleError = (error: HttpErrorResponse) => {
let errorMessage = '';
if (error.error instanceof ErrorEvent) {
errorMessage = `错误: ${error.error.message}`;
} else {
errorMessage = `服务器返回代码: ${error.status}, 错误信息: ${error.message}`;
}
this.message.error(errorMessage, { nzDuration: 5000 });
return throwError(new Error(errorMessage));
}
}