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

Flutter Post请求Body传参异常:Firebase设备令牌被截断

解决Flutter Post请求中设备令牌被截断的问题

可能的原因及排查步骤

  1. 日志显示截断而非实际数据截断
    很多调试工具(如IDE日志、服务器日志)会对过长字符串显示为...,但实际数据已完整发送。先确认真实情况:

    • 在发送前打印令牌长度:
      print('设备令牌长度: ${token.length}');
      
    • 让服务器端开发人员打印接收到的完整deviceToken内容和长度,确认是否真的被截断。
  2. 变量名冲突导致的潜在问题
    你的代码中方法参数String data和内部定义的Map data重名,虽然当前deviceToken用的是token参数,但这种命名容易引发混淆,建议立即修改。

  3. 表单编码的局限性
    默认使用x-www-form-urlencoded编码发送表单数据,虽然理论上支持长字符串,但部分服务器对这种编码的长字段处理可能存在问题,改用JSON格式发送更可靠。

修复后的代码示例

改用JSON格式发送请求,同时修正变量名冲突:

import 'dart:convert'; // 需要导入该包使用jsonEncode

@override
Future getPostApiSendNotificationResponse(String url, String token, String requestData) async {
  dynamic responseJson;
  final Map<String, String> headers = {
    'Authorization': "Bearer $token",
    'Content-Type': 'application/json' // 指定请求体为JSON格式
  };
  // 修正变量名,避免和方法参数冲突
  final Map<String, dynamic> bodyData = {
    "deviceToken": token,
  };
  try {
    final response = await http
        .post(
          Uri.parse(url),
          body: jsonEncode(bodyData), // 将Map转为JSON字符串
          headers: headers,
        )
        .timeout(const Duration(seconds: 10));
    responseJson = returnResponse(response);
  } on SocketException {
    throw FetchDataException("No Internet Connection");
  }
  return responseJson;
}

额外检查项

  • 确认服务器端接收接口支持application/json格式的请求体,并正确解析JSON数据。
  • 检查服务器存储deviceToken的字段长度,Firebase设备令牌通常在150-200字符左右,确保字段长度足够(如数据库字段设为VARCHAR(500)或更长)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 23:15:09