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

Flutter Android应用Authorization请求头Token传值为NULL问题求助

Flutter请求中Authorization令牌在PHP服务端接收为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:43:13