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

