Django集成Firebase发送通知遇JSONDecodeError问题求助
问题分析与解决
错误原因定位
你遇到的JSONDecodeError: Expecting value: line 1 column 1 (char 0),本质是调用result.json()时,服务器返回的不是有效JSON内容,甚至可能是空响应。结合你的代码,核心问题有这些:
1. FCM API密钥为空
你的fcm_api变量是空字符串,导致请求的Authorization头无效,FCM服务器会返回非JSON格式的错误响应(比如401 Unauthorized的纯文本),直接触发JSON解析失败。
2. 函数参数未实际使用
函数定义了registration_ids、message_title、message_desc参数,但payload里完全写死固定值,既浪费了函数的复用性,也无法动态传递通知内容和目标设备。
3. 请求写法冗余易出错
requests.post支持直接传入json参数自动序列化,无需手动调用json.dumps(),手动处理反而容易出现格式问题。
修复后的代码
import requests import json def send_notification(registration_ids, message_title, message_desc): # 替换为你的FCM服务器密钥 fcm_api = "YOUR_VALID_FCM_API_KEY" url = "https://fcm.googleapis.com/fcm/send" headers = { "Authorization": f'key={fcm_api}' } payload = { "registration_ids": registration_ids, "priority": "high", "notification": { "body": message_desc, "title": message_title, "image": "https://i.ytimg.com/vi/m5WUPHRgdOA/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDwz-yjKEdwxvKjwMANGk5BedCOXQ", "icon": "https://yt3.ggpht.com/ytc/AKedOLSMvoy4DeAVkMSAuiuaBdIGKC7a5Ib75bKzKO3jHg=s900-c-k-c0x00ffffff-no-rj" } } try: result = requests.post(url, json=payload, headers=headers) # 先校验HTTP状态码 result.raise_for_status() print(result.json()) except requests.exceptions.HTTPError as e: print(f"请求错误: {e}") print(f"服务器返回内容: {result.text}") except json.JSONDecodeError: print("服务器返回非JSON格式响应") print(f"响应内容: {result.text}")
关键修复说明
- 填充有效FCM密钥:必须将
YOUR_VALID_FCM_API_KEY替换为Firebase控制台获取的服务器密钥,否则请求会被拒绝。 - 复用函数参数:payload中的设备ID、通知标题和内容改为使用函数传入的参数,实现动态配置。
- 简化请求逻辑:用
json=payload替代手动序列化,requests会自动处理JSON格式和Content-Type头。 - 增加异常捕获:捕获HTTP错误和JSON解析错误,打印具体响应内容,方便快速定位问题。
内容的提问来源于stack exchange,提问作者harsh dhariwal
相关产品推荐
相关产品推荐

