Flutter Post请求Body传参异常:Firebase设备令牌被截断
解决Flutter Post请求中设备令牌被截断的问题
可能的原因及排查步骤
日志显示截断而非实际数据截断
很多调试工具(如IDE日志、服务器日志)会对过长字符串显示为...,但实际数据已完整发送。先确认真实情况:- 在发送前打印令牌长度:
print('设备令牌长度: ${token.length}'); - 让服务器端开发人员打印接收到的完整
deviceToken内容和长度,确认是否真的被截断。
- 在发送前打印令牌长度:
变量名冲突导致的潜在问题
你的代码中方法参数String data和内部定义的Map data重名,虽然当前deviceToken用的是token参数,但这种命名容易引发混淆,建议立即修改。表单编码的局限性
默认使用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
相关产品推荐
相关产品推荐

