You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

axios请求返回400状态码时如何获取响应体内容

问题原因

Axios 默认配置下,仅当接口返回状态码处于 2xx 区间时才会进入 then 回调,其余状态码都会触发 Promise 拒绝进入 catch 分支。400 状态码属于客户端错误,默认就会进入 catch 逻辑,对应的响应内容存放在 err.response 字段中,你无法拿到响应通常是以下几个原因:

  • 自定义的 axios 实例配置了错误的 validateStatus 规则,导致响应结构被篡改
  • 全局响应拦截器的错误分支没有完整返回 error 对象,丢失了 response 字段
  • catch 分支的错误处理逻辑存在边界遗漏

解决方案

1. 修正 axios 实例的基础配置

显式声明 validateStatus 规则,确保非 2xx 状态码正常进入 catch 分支且保留完整响应结构:

const axios_instance = axios.create({
  baseURL: '你的接口基础前缀',
  timeout: 10000,
  // 保持默认规则:仅2xx状态码走resolve,其余走reject
  validateStatus: (status) => status >= 200 && status < 300
})

2. 修正全局响应拦截器的错误处理

如果你的项目配置了全局响应拦截器,确保错误分支完整返回 error 对象,不要只返回错误字符串:

axios_instance.interceptors.response.use(
  (response) => response,
  (error) => {
    // 不要自定义返回内容,直接抛出完整error对象才能保留response字段
    return Promise.reject(error)
  }
)

3. 优化接口请求的错误处理逻辑

补充 catch 分支的边界判断,兼容不同错误场景,同时正确读取响应内容:

const getValidIdTypes = async () => {
  return infoActions.getIdTypes()
  .then(res => {
    if (res.status === 200 || res.status === 201) {
      setValidIdTypes(res.data)
    } else {
      pushToFlasher(res.data)
    }
  })
  .catch(err => {
    // 有响应返回:接口返回了非2xx状态码,比如400、401、500等
    if (err.response) {
      console.log("错误状态码:", err.response.status)
      console.log("错误响应内容:", err.response.data)
      // 可选链兜底,避免响应内容为空时报错
      pushToFlasher(err.response.data ?? "请求参数无效,请检查提交内容")
    } 
    // 请求已发出但无响应:比如网络超时、跨域拦截、服务端未返回内容
    else if (err.request) {
      console.log("请求无响应:", err.request)
      pushToFlasher("网络异常,请检查网络连接后重试")
    } 
    // 请求未发出:配置错误导致请求发起失败
    else {
      console.log("请求发起失败:", err.message)
      pushToFlasher("请求配置错误,请稍后重试")
    }
  })
}

内容的提问来源于stack exchange,提问作者Luis Alfonso Buelvas Betancour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:42:01