Angular HTTP拦截器解析失败问题:适配文本响应类型请求
解决方案
第一步:修正API服务的请求写法
你的refreshDetails方法里,HttpClient.post的参数顺序有误。post的第二个参数是请求体(body),第三个才是配置选项。如果这个接口不需要传body,应该把null作为第二个参数,再传responseType配置:
refreshDetails(): Observable<string> { // 注意参数顺序:url, body, options return this.http.post('../app/refreshDetail', null, { responseType: 'text' }); }
第二步:在拦截器中根据请求的响应类型处理错误
在拦截器的catchError逻辑里,你可以通过request.responseType判断当前请求预期的响应类型。如果是'text',就忽略JSON解析失败的错误;如果是默认的'json',则正常抛出错误。
修改后的拦截器代码如下:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { this.totalRequests++; this.loaderService.show(); return next.handle(request).pipe( timeout(30000), tap( (event) => { // 修复instanceof语法错误 if (event instanceof HttpResponse) { const contentDisposition = event.headers.get('content-disposition'); if (contentDisposition) { const c = contentDisposition.split(':'); if (c[1]) { // 修复数组下标多余的右括号 const c1 = c[1].trim().split('='); if (c1[1]) { const filename = c1[1].trim().replace(/['"]+/g, '').toString(); if (filename) { localStorage.setItem("downloadFileName", filename); } } } } } }, (error: HttpErrorResponse) => { console.log(error); } ), catchError((error: HttpErrorResponse) => { // 判断是否为JSON解析错误,且请求预期响应类型是text const isJsonParseError = error.error instanceof ErrorEvent && error.message.includes('JSON'); if (isJsonParseError && request.responseType === 'text') { // 构造包含文本响应的成功对象返回,避免抛出错误 const textResponse = new HttpResponse({ body: error.error?.message || error.message, headers: error.headers, status: error.status, statusText: error.statusText }); return of(textResponse); } // 其他情况正常抛出错误 return throwError(() => error); }), finalize(() => { this.totalRequests--; if (this.totalRequests === 0) { this.loaderService.hide(); } }) ); }
关键说明
- 参数顺序修正:确保
responseType作为配置选项传递,而非错误地当成请求体。 - 语法错误修复:修正了
instanceOf的大小写错误、数组下标多余括号的问题。 - 错误区分处理:通过
request.responseType识别请求类型,对text类型请求的解析错误做特殊处理,不抛出错误;其他请求保持原有错误抛出逻辑。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

