HttpInterceptor - 展开 API 响应
HttpInterceptor - unwrapping API response
如何使用 HttpInterceptor 解包 API 响应?
我的API响应模型:
export interface ApiResponse<T> {
data: T;
statusCode: number;
errorMessage: string;
}
我想实现的是,我的拦截器链中的最后一个拦截器仅从上述模型返回 data
属性。
@Injectable()
export class UnwrapInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<any> {
return next.handle(req).pipe(
map(event => {
if (event instanceof HttpResponse && event.url.match('/api/')) {
console.log('Unwrapping data: ', event.body.data);
return of(event.body.data);
}
return event;
})
);
}
}
我在请求数据时从拦截器获得了控制台日志,但是某处的数据消失了,最后我没有得到任何响应。
点击按钮后调用 API 的测试组件:
@Component({
selector: 'app-user-list-page',
templateUrl: './user-list-page.component.html',
styleUrls: ['./user-list-page.component.scss']
})
export class UserListPageComponent implements OnInit {
userList: User[];
constructor(private http: HttpService) {}
ngOnInit() {}
performRequest() {
this.http.get<User[]>('/api/users').subscribe((data: User[]) => {
console.log('Received from component: ', data); <==+ never executed
return (this.userList = data);
});
}
}
上述组件中的 HttpService
只是调用 Angular HttpClient
.
我正在使用 Angular 7.1.0
.
而不是仅仅 return 观察 body 数据,你仍然应该 return 一个 HttpResponse
实例,它只包含一个变异的 body ,例如通过克隆响应:
if (event instanceof HttpResponse && event.url.match('/api/')) {
console.log('Unwrapping data: ', event.body.data);
event = event.clone({ body: event.body.data });
}
return event;
如何使用 HttpInterceptor 解包 API 响应?
我的API响应模型:
export interface ApiResponse<T> {
data: T;
statusCode: number;
errorMessage: string;
}
我想实现的是,我的拦截器链中的最后一个拦截器仅从上述模型返回 data
属性。
@Injectable()
export class UnwrapInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<any> {
return next.handle(req).pipe(
map(event => {
if (event instanceof HttpResponse && event.url.match('/api/')) {
console.log('Unwrapping data: ', event.body.data);
return of(event.body.data);
}
return event;
})
);
}
}
我在请求数据时从拦截器获得了控制台日志,但是某处的数据消失了,最后我没有得到任何响应。
点击按钮后调用 API 的测试组件:
@Component({
selector: 'app-user-list-page',
templateUrl: './user-list-page.component.html',
styleUrls: ['./user-list-page.component.scss']
})
export class UserListPageComponent implements OnInit {
userList: User[];
constructor(private http: HttpService) {}
ngOnInit() {}
performRequest() {
this.http.get<User[]>('/api/users').subscribe((data: User[]) => {
console.log('Received from component: ', data); <==+ never executed
return (this.userList = data);
});
}
}
上述组件中的 HttpService
只是调用 Angular HttpClient
.
我正在使用 Angular 7.1.0
.
而不是仅仅 return 观察 body 数据,你仍然应该 return 一个 HttpResponse
实例,它只包含一个变异的 body ,例如通过克隆响应:
if (event instanceof HttpResponse && event.url.match('/api/')) {
console.log('Unwrapping data: ', event.body.data);
event = event.clone({ body: event.body.data });
}
return event;