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

