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

Flutter测试中HTTP GET请求返回400,正常调用返回200的问题

Flutter Web及测试环境中HTTP请求返回400状态码问题

问题描述

在Postman或浏览器中发起HTTP GET请求可正常返回200状态码,但在Flutter的Web(Chrome)模拟器和flutter-test中始终返回400状态码。

环境配置

Flutter (Channel stable, 3.24.3, on macOS 15.1 24B83 darwin-arm64
Dart version 3.5.3
DevTools version 2.37.3

简化测试代码

Future<String> httpget(String urlStr, String path, Map<String, dynamic> params) async {
  try {
    var url = Uri.https(urlStr, path);
    var response = await http.get(url);
    print('Response status: ${response.statusCode}');
    print('Response body: ${response.body}');
    print('Response header: ${response.headers}');

    return response.body;
  } catch (e) {
    print('Error: $e');
    throw e;
  }
}

Future<String> dioget(String url, Map<String, dynamic> params) async {
  try {
    var dio = Dio();
    dio.interceptors.add(LogInterceptor());
    Response response = await dio.get(
      url,
      queryParameters: params,
      options: Options(
        validateStatus: (int? status) {
          return status != null;
        },
      ),
    );
    return response.data;
  } catch (e) {
    print('Error: $e');
    throw e;
  }
}

test('network test', () async {
  // http package
  String url = "httpbin.org";
  String path = "get";
  await httpget(url, path, {}).then((response) {
    print(response);
  });

  // dio package
  await dioget("http://httpbin.org/get", {}).then((response) {
    print(response);
  });
});

测试输出

*** Response ***
uri: http://httpbin.org/get
statusCode: 400
headers:

额外情况

我可以在Chrome或Postman中正常打开http://httpbin.org/get。另外,将dio的GET请求放在Text组件的FutureBuilder中时可以正常工作,但在flutter-test中依然无法正常执行,相关代码如下:

class Header extends StatelessWidget {
  const Header({Key? key}) : super(key: key);
  Future<String> dioget(String url, Map<String, dynamic> params) async {
    try {
      var dio = Dio();
      dio.interceptors.add(LogInterceptor());
      Response response = await dio.get(
        url,
        queryParameters: params,
        options: Options(
          validateStatus: (int? status) {
            return status != null;
          },
        ),
      );
      return response.data["url"];
    } catch (e) {
      print('Error: $e');
      throw e;
    }
  }
  @override
  Widget build(BuildContext context) =>
      Container(
        color: Colors.red.withOpacity(0.5),
        child: FutureBuilder<String>(
          future: dioget("https://httpbin.org/get", {"test": "test"}),
          builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return CircularProgressIndicator();
            } else if (snapshot.hasError) {
              return Text('Error: ${snapshot.error}');
            } else {
              return Text(snapshot.data ?? 'No data');
            }
          },
        ),
      );
}

内容的提问来源于stack exchange,提问作者Kyrie Cui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 07:32:11