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

Dart中处理非Ok请求:如何获取状态码且不抛异常?

解决Dart中获取400 Bad Request状态码的问题

嘿,我完全懂你的困扰!默认的http.post()方法确实会在遇到非2xx状态码时抛出ClientException,而且这个异常里压根不带状态码和响应体——这设计对咱们需要处理特定错误码的场景太不友好了。

别着急,咱们换个思路:用http.Client.send()方法代替post(),它不会自动为非2xx状态码抛出异常,能完整返回所有响应信息,包括你急需的状态码和响应体。

下面是具体的代码示例,你可以直接参考:

import 'package:http/http.dart' as http;

// 处理POST请求的方法
Future<void> handlePostRequest() async {
  final targetUrl = Uri.parse('你的目标接口地址');
  
  // 构造POST请求
  final request = http.Request('POST', targetUrl);
  // 设置请求头(根据你的接口需求调整)
  request.headers['Content-Type'] = 'application/json';
  // 设置请求体(这里以JSON为例,按需修改)
  request.body = '{"username": "test", "password": "123456"}';

  try {
    // 发送请求,这里不会因非2xx状态码抛异常
    final streamedResponse = await http.Client().send(request);
    // 将StreamedResponse转换为普通Response,方便获取body和状态码
    final response = await http.Response.fromStream(streamedResponse);

    // 现在你可以自由获取状态码和响应体了!
    print('响应状态码: ${response.statusCode}');
    print('响应体内容: ${response.body}');

    // 根据状态码做针对性处理
    if (response.statusCode == 400) {
      // 处理400 Bad Request的业务逻辑
      print('请求参数有误,检查输入内容!');
    } else if (response.statusCode >= 200 && response.statusCode < 300) {
      // 处理请求成功的逻辑
      print('请求成功!');
    } else {
      // 处理其他状态码的情况
      print('请求返回异常状态码: ${response.statusCode}');
    }
  } catch (e) {
    // 这里只会捕获真正的网络异常(比如连接超时、域名不存在等)
    print('网络请求出错: $e');
  }
}

简单解释下原理:

  • send()方法返回的是StreamedResponse,它是流式的响应对象,需要用Response.fromStream()转换成咱们熟悉的Response对象,这样就能直接获取statusCode和body了。
  • 只有当出现真正的网络故障(比如无法连接服务器)时,才会进入catch块,而像400、500这类业务层面的状态码,都会正常返回给咱们处理。

这样就能完美解决你需要获取状态码和响应体的需求啦!

内容的提问来源于stack exchange,提问作者amiry jd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:04:30