Flutter Web中带请求体的GET请求无法正常工作
解决Flutter Web端发送带请求体的GET请求问题
问题原因
Flutter Web端的http包底层依赖浏览器网络API,而多数浏览器的安全机制会忽略GET请求的请求体,导致你用Postman生成的代码在移动端正常,但Web端无法正确发送带body的GET请求。Postman能正常调用是因为它使用独立网络栈,不受浏览器限制。
解决方案
通过区分平台处理:移动端保留原有http包逻辑,Web端直接使用dart:html的HttpRequest构造请求,强制发送请求体。
完整代码示例:
import 'dart:convert'; import 'dart:io'; import 'package:http/http.dart' as http; // 仅Web端生效的导入 import 'dart:html' as html; Future<String> fetchDataWithGetBody() async { const targetUrl = "https://<domain>/path"; final requestBody = json.encode({"source": 10}); if (Platform.isWeb) { // Web端处理逻辑 final request = html.HttpRequest(); request.open('GET', targetUrl); request.setRequestHeader('content-type', 'application/json'); return await Future<String>((resolve, reject) { request.onLoad.listen((_) { if (request.status == 200) { resolve(request.responseText!); } else { reject(Exception(request.statusText)); } }); request.onError.listen((error) => reject(error)); request.send(requestBody); }); } else { // 移动端原有逻辑 final headers = {"content-type": "application/json"}; final request = http.Request("GET", Uri.parse(targetUrl)); request.body = requestBody; request.headers.addAll(headers); final response = await request.send(); if (response.statusCode == 200) { return await response.stream.bytesToString(); } else { throw Exception(response.reasonPhrase); } } }
注意事项
- 确保Flutter Web项目已启用
dart:html支持(默认已启用,无需额外依赖)。 - 该方案属于折中处理,仅在无法修改后端接口的场景下使用,遵循HTTP规范的方案仍是优先选择。
内容的提问来源于stack exchange,提问作者viJay Singh
相关产品推荐
相关产品推荐

