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

Flutter Web端http.get遇非200状态码抛异常,如何获取响应信息?

Flutter Web 处理HTTP非200状态码的方案

Flutter原生端调用http.get()时,遇到403、404这类非200状态码会正常返回响应,但Web端会直接抛出http.ClientException(消息显示"XMLHttpRequest error"),导致没法获取响应体和具体状态码。下面是几种可靠的解决方法:

方法一:用http.Client.send()替代上层封装的get()

http.get()是封装后的便捷方法,会自动把非200状态码转为异常;而底层的send()方法不管状态码是什么,都会返回StreamedResponse,你可以手动将其转为Response后处理。

示例代码:

final client = http.Client();
try {
  Uri uri = Uri.parse(apiEndpoint);
  final request = http.Request('GET', uri)
    ..headers['Authorization'] = 'Bearer token';
  final streamedResponse = await client.send(request);
  final response = await http.Response.fromStream(streamedResponse);
  
  // 无论状态码是否为200,这里都会执行
  print(response.statusCode);
  switch (response.statusCode) {
    case 403:
      // 处理权限不足逻辑
      break;
    case 404:
      // 处理资源不存在逻辑
      break;
    case 500:
      // 处理服务器错误逻辑
      break;
  }
} catch (e) {
  // 这里只捕获真正的网络异常(比如连接失败、跨域问题)
  print('网络错误: $e');
} finally {
  client.close();
}

方法二:使用第三方HTTP库(推荐)

比如dio库,它在跨端处理上更统一,默认可以配置不将非200状态码转为异常,直接返回包含完整信息的响应对象。

示例代码(需要先添加dio依赖):

final dio = Dio();
try {
  final response = await dio.get(
    apiEndpoint,
    options: Options(
      headers: {'Authorization': 'Bearer token'},
      // 设置validateStatus为true或自定义判断逻辑,关闭非200状态码抛异常的行为
      validateStatus: (status) => true,
    ),
  );
  print(response.statusCode);
  // 根据状态码处理对应逻辑
} catch (e) {
  print('网络错误: $e');
}

方法三:从异常中提取状态码(不推荐)

部分场景下,Web端抛出的ClientException消息里会包含状态码,你可以通过正则匹配提取,但这种方法依赖异常消息的格式,一旦http包更新可能失效,仅作为临时方案。

示例代码:

try {
  Uri uri = Uri.parse(apiEndpoint);
  final response = await http.get(uri, headers: {"Authorization": "Bearer token"});
  print(response.statusCode);
} catch (e) {
  if (e is http.ClientException) {
    final match = RegExp(r' status code (\d+)').firstMatch(e.message);
    if (match != null) {
      final statusCode = int.parse(match.group(1)!);
      print('捕获到状态码: $statusCode');
      // 根据状态码处理逻辑
    } else {
      print('无法解析状态码: $e');
    }
  } else {
    print('其他异常: $e');
  }
}

内容的提问来源于stack exchange,提问作者Maxim Suponya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:35:55