我似乎无法从 HTTP Observable 和响应对象中获取可靠的错误信息。在某些情况下,它会报告正确的数据,但在其他时候,我得到的响应对象实际上是空的。
进行实际调用的服务通过以下方式创建可观察对象:
return this.http.post(this.config.urls.url("login"), {
username: username,
password: password
}, new RequestOptions({withCredentials:true}));
在上面的代码中,服务器返回一个带有 JSON 错误响应的 401,但 subscribe() 响应既没有获取响应数据,也没有获取状态代码或消息。错误处理程序触发,但响应对于确定错误信息是无用的。
我尝试在 .subscribe() (如上面的组件中)、.catch() 方法和 .map() (在服务中)上拦截错误处理程序,但在所有情况下,响应中都没有可用数据. 如果没有有效的响应,就不可能向用户返回错误消息
然而,我看过这项工作,但我无法终生看到有什么不同。
我想这样做:
- 服务方法在服务中进行 HTTP 调用
- 服务方法具有 .catch( response ) 处理程序并修复错误对象
- 客户端发出订阅并具有接受错误对象的错误处理程序
这适用于 Promises (.toPromise),但使用原始 Observables 在许多情况下我似乎无法获得正确的错误信息。
关于如何使这项工作可靠地工作以及为什么响应没有返回状态信息的任何建议?
更新:
事实证明,问题是由服务器端进行自动身份验证重定向引起的。如果发生 401,服务器一直在向登录页面返回 302 请求,并且看起来 Observables 正在吃 302 - 没有跟踪,也没有捕获状态代码/原始请求数据。
我将把这个放在操作员错误(我)上,但把它留在这里,以防其他人遇到这种问题。故事的寓意——注意 Observables 的 302 重定向响应。