Dart中response.body作为token请求失败,直接赋值字符串却正常的问题
这个问题我之前也碰到过!看起来字符串内容完全一样,但实际藏着不可见的控制字符(比如换行、回车、BOM头),这些字符在打印时不会显示,但会导致API验证失败。下面是具体的排查和解决步骤:
1. 先排查字符串的真实长度
直接对比变量和手动输入字符串的长度,就能快速判断是否有隐藏字符。在Dart里添加打印代码:
print('Token length from response: ${_token.length}'); print('Token length hardcoded: ${'token'.length}');
如果两者长度不一样,说明变量里肯定包含了额外的字符。
2. 打印每个字符的Unicode码点
把字符串拆成单个字符的Unicode码点,就能直观看到隐藏的无效字符:
print('--- Token from response ---'); _token.runes.forEach((rune) => print('Rune: $rune | Char: "${String.fromCharCode(rune)}"')); print('--- Hardcoded token ---'); 'token'.runes.forEach((rune) => print('Rune: $rune | Char: "${String.fromCharCode(rune)}"'));
比如如果看到Rune: 10(换行符)或者Rune: 13(回车符),那就是导致验证失败的元凶。
3. 清理字符串中的无效字符
如果发现有额外字符,先尝试用trim()去掉首尾的空白字符:
_token = _response.body.trim();
如果trim()解决不了,用正则替换掉所有非打印的控制字符:
_token = _response.body.replaceAll(RegExp(r'[\x00-\x1F\x7F]'), '');
4. 检查PHP端的输出是否纯净
有时候问题出在服务器端,比如PHP输出前有多余的空格、换行,或者BOM头。可以在输出前清理缓冲区并终止脚本,确保只返回纯token内容:
elseif($_POST['action']=='get_defects'){ ob_clean(); // 清空之前的输出缓冲区,避免额外输出 $data = get_aircraft_by_token($_POST['token']); echo $data['Defects']; exit; // 强制终止脚本,确保后续没有任何额外输出 }
5. 验证响应的编码正确性
确认Dart接收的响应编码正确,打印响应的Content-Type头:
print('Response Content-Type: ${_response.headers['content-type']}');
如果服务器没有指定charset,可能会导致解码异常,这时候可以手动指定编码:
import 'dart:convert'; // ... _token = utf8.decode(_response.bodyBytes);
这种情况本质是视觉上相同的字符串,实际字节序列不同,API的token验证是严格匹配字节的,所以变量版会失败,手动输入的能成功。按上面的步骤排查,应该能很快找到问题~
内容的提问来源于stack exchange,提问作者Simon Lowther
相关产品推荐
相关产品推荐

