Kotlin实现Firebase推送Post请求无响应,请求排查配置错误
问题分析与修复方案
我帮你梳理下代码里的几个关键问题,这些应该就是导致请求无响应的核心原因:
1. Authorization 请求头配置错误
你在RestInterface里的Authorization头只写了"Authorization: key",但FCM要求的格式是"Authorization: key=你的服务器密钥"——这里缺少了关键的=符号和你实际使用的服务器密钥(就是Postman请求里正常工作的那个密钥)。
修复后的接口定义:
interface RestInterface { @Headers( "Content-Type: application/json", "Authorization: key=YOUR_REAL_SERVER_KEY" // 替换成你的真实服务器密钥 ) @POST("fcm/send") fun sendingNotification(@Body body: NotificationBody): Call<ResponseBody> }
2. 实体类序列化字段不匹配
你的NotificationBody和Data类存在两处序列化问题:
- 你把
Data对象标注为@SerializedName("notification"),但FCM的notification字段中,消息内容的标准字段名是body而非你写的content; - Kotlin里完全不用单独写
init块初始化字段,直接用主构造函数配合SerializedName更简洁不易出错。
修复后的实体类(对应FCM的notification类型消息):
data class NotificationBody( @SerializedName("notification") val notification: NotificationContent, @SerializedName("to") val to: String ) data class NotificationContent( @SerializedName("title") val title: String, @SerializedName("body") val body: String // 改为FCM标准字段名body )
如果你的Postman请求用的是data字段(而非notification),只需把NotificationBody里的@SerializedName("notification")改成@SerializedName("data")即可。
3. Retrofit Callback 的 Kotlin 语法错误
你现在用的是Java风格的Callback写法,在Kotlin里会直接触发语法错误,正确的Kotlin写法应该是这样的:
response.enqueue(object : Callback<ResponseBody> { override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) { if (response.isSuccessful) { Log.d("kkkk", "通知发送成功:${response.body()?.string()}") } else { Log.e("kkkk", "请求失败:${response.errorBody()?.string()}") } } override fun onFailure(call: Call<ResponseBody>, t: Throwable) { Log.e("kkkk", "请求出错:${t.message}", t) } })
Kotlin里不需要@Override和public关键字,要用object :创建匿名内部类,同时建议在onResponse里判断请求是否成功,打印错误信息方便排查问题。
4. 其他潜在检查点
- 确保
deviceId是有效的FCM令牌,和Postman请求里使用的完全一致; - 确认AndroidManifest中添加了网络权限:
<uses-permission android:name="android.permission.INTERNET" />(虽然Postman能成功,但代码里没加的话会直接导致请求失败)。
按照上面的修改调整后,再测试应该就能正常发送推送通知了。
内容的提问来源于stack exchange,提问作者Sander
相关产品推荐
相关产品推荐

