为什么 axios 会抛出status < 200 || status >= 300
? 见defaults.js#L84
HTTP 错误 500 意味着我们到达了服务器,甚至使用 http 协议得到了有效的响应。
从应用程序的角度来看,HTTP 错误 500 可能被视为异常,但这是在不同的抽象级别,并且与 HTTP 抽象完全无关。
为了与即将到来的 fetch 规范前向兼容,我认为重要的是 axios 不会在 HTTP 响应有效的情况下抛出。
fetch 规范指定了一个response.ok
属性,以便应用程序开发人员可以轻松识别 HTTP 操作的结果,我相信类似的方法可能对 axios 有用。
有关获取规范的更多详细信息,请参见此处:
https://fetch.spec.whatwg.org/#dom -response-ok
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
我认为您可以使用 validateStatus 配置选项在有服务器响应时始终解决。 来自文档:
// `validateStatus` defines whether to resolve or reject the promise for a given
// HTTP response status code. If `validateStatus` returns `true` (or is set to `null`
// or `undefined`), the promise will be resolved; otherwise, the promise will be
// rejected.
validateStatus: function (status) {
return status >= 200 && status < 300; // default
}
正确,但我的意思是这不应该是默认值。 事实上,这甚至不应该是可配置的。
我们理解您的担忧,但 Axios 并不意味着要取代fetch
也不是模仿它的行为。 我们甚至不使用它作为适配器来拨打电话(我们暂时坚持使用 XHR)。
Axios 尝试尽可能地可配置,提供大多数人将使用的默认值。 在这种情况下,人们倾向于在服务器响应后立即验证状态码。 例如:
fetch(url).then(verifyStatus).then(...);
这就是存在fetch-check-http-status 之类的软件包的原因。
我们希望避免这种频繁重复的结构。 如果您想使用来自服务器的任何有效响应进行解析,您始终可以设置validateStatus: false
。
最有用的评论
正确,但我的意思是这不应该是默认值。 事实上,这甚至不应该是可配置的。