FCM推送报411错误:POST请求需Content-length头问题求助
问题排查与修复方案
核心问题分析
收到411错误的本质原因并非真的缺少Content-Length头,而是请求中存在其他格式或配置错误,导致服务器无法正确解析请求,进而返回了误导性的状态码。具体问题点如下:
- 授权令牌格式异常:
shell_exec执行Python脚本返回的$auth_token可能包含换行符、空格等多余空白字符,导致Authorization头格式无效 - 手动设置Content-Length冗余且易出错:curl会自动计算并设置Content-Length头,手动计算若存在编码偏差(如多字节字符)会导致长度不匹配
- FCM接口URL错误:v1版本的FCM接口URL格式应为
https://fcm.googleapis.com/v1/projects/{PROJECT_ID}/messages:send,你的URL中black-queen/8eff3不符合规范 - 未定义变量错误:代码末尾
print($response)中的$response未定义,属于无效输出
修复后的代码
function sendNotification($token, $title, $body){ $command = escapeshellcmd('/usr/bin/python3 api/fcm.py'); // 清理令牌中的换行、空格等冗余字符 $auth_token = trim(shell_exec($command)); // 构造请求数据 $request_data = array( 'message' => array( 'token' => $token, 'notification' => array( 'body' => $body, 'title' => $title ) ) ); $fields = json_encode($request_data); // 配置请求头,移除手动设置的Content-Length $headers = array( 'Content-Type: application/json', 'Authorization: Bearer ' . $auth_token ); // 修正FCM接口URL,替换为你的Firebase项目ID $url = 'https://fcm.googleapis.com/v1/projects/black-queen/messages:send'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // 生产环境建议开启SSL验证 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); $result = curl_exec($ch); echo $result; // 排查curl执行错误 if(curl_errno($ch)) { print('Error: ' . curl_error($ch)); } curl_close($ch); // 输出正确的响应结果 print($result); }
额外排查建议
- 验证授权令牌:直接输出
$auth_token,确认是无多余字符的纯令牌字符串 - 检查Python脚本:确保
api/fcm.py仅输出令牌,无多余打印日志 - 模拟请求测试:用Postman等工具构造相同请求,验证URL、令牌、请求体的有效性
内容的提问来源于stack exchange,提问作者Dhwanit Zaveri
相关产品推荐
相关产品推荐

