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
相关产品推荐
相关产品推荐

