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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:43:15