Flutter Android应用Authorization请求头Token传值为NULL问题求助
问题背景
在Android平台开发Flutter应用时,readData()方法通过HTTP请求头Authorization: Bearer $token传递令牌,但PHP服务端接收到的token始终为NULL。尝试过$token、${token}、纯文本字符串形式传递均无效,但用在线工具发送带纯文本token的GET请求时服务端能正常接收。
相关代码
Flutter端readData()方法
Future readData() async { SharedPreferences prefs = await SharedPreferences.getInstance(); String token = prefs.getString('token').toString(); print('Token : $token'); // 此处打印的token正常 final response = await get( Uri.parse('https://www.somehost.com/api.php'), headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'Authorization': 'Bearer $token', // 服务端日志显示此处token为null } ); print(response.statusCode); var data = jsonDecode(response.body.toString()); print(data); print(data['success']); print(data['user']['email']); }
PHP服务端代码
<?php header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Headers: access"); header("Access-Control-Allow-Methods: GET"); header("Content-Type: application/json; charset=UTF-8"); header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"); require __DIR__.'/classes/db.php'; require __DIR__.'/auth.php'; $allHeaders = getallheaders(); $db_connection = new Database(); $conn = $db_connection->dbConnection(); $auth = new Auth($conn, $allHeaders); echo json_encode($auth->isValid()); ?>
排查与解决方案
1. 修正SharedPreferences的token获取逻辑
Flutter中prefs.getString('token')如果返回null,调用.toString()会得到字符串"null"而非实际令牌,导致服务端解析失败。修改代码验证真实值:
String? token = prefs.getString('token'); if (token == null) { print('Token未在SharedPreferences中找到'); return; } // 后续直接使用token,无需额外toString()
2. 合并CORS头部配置
PHP中重复设置Access-Control-Allow-Headers会导致配置冲突,保留一个包含所有允许字段的配置即可:
header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With");
3. 验证请求头的实际传递情况
- Flutter端添加日志打印完整请求头,确认
Authorization字段内容:print('请求头: {Content-Type: application/json, Accept: application/json, Authorization: Bearer $token}'); - PHP服务端临时打印所有接收的头部,排查是否真的未收到:
var_dump(getallheaders()); // 测试完成后删除该行
4. 兼容请求头的大小写差异
部分服务器会将请求头字段转为小写,需在Auth类中兼容大小写提取令牌:
// 在Auth类的isValid()方法中添加兼容逻辑 $authHeader = isset($allHeaders['Authorization']) ? $allHeaders['Authorization'] : (isset($allHeaders['authorization']) ? $allHeaders['authorization'] : null);
内容的提问来源于stack exchange,提问作者bzc0fq
相关产品推荐
相关产品推荐

