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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:25:23