Java 服务器到Firebase HTTP POST的结果为响应消息200
使用Java代码(向下滚动查看)我使用FCM向我的Android发送通知消息,当提供正确的服务器密钥令牌时,我会收到如下所示的响应消息 以下响应消息在之后从FCM接收Java 服务器到Firebase HTTP POST的结果为响应消息200,java,android,firebase,firebase-cloud-messaging,Java,Android,Firebase,Firebase Cloud Messaging,使用Java代码(向下滚动查看)我使用FCM向我的Android发送通知消息,当提供正确的服务器密钥令牌时,我会收到如下所示的响应消息 以下响应消息在之后从FCM接收 Response: 200 Success Message: '{"multicast_id":-1,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}' Error Message: '' Process
Response: 200
Success Message: '{"multicast_id":-1,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}'
Error Message: ''
Process finished with exit code 0
这意味着服务器密钥令牌是正确的,并且使用FCM建立了某种授权。当我使用不正确的服务器密钥令牌时,会收到不同的错误消息。但是,上面的消息虽然标记为“Success message*”,但仍然表示成功值=0,失败值=1,错误:InvalidRegistration如果这确实是一个错误,那么该错误是否意味着FCM没有收到通知,或者端点Android应用程序没有收到通知?
Android应用程序
Android应用程序能够使用控制台接收来自FCM的通知这是否意味着Android应用程序被设置为从我编写的Java服务器接收相同的通知,或者应用程序是否需要额外的代码来处理这些未从控制台发送的通知?
(仅供参考,代码是干净的,运行时没有错误,下面没有显示项目的所有文件,只有相关的主函数和HTTP POST文件)
Java服务器
public class Sample {
private static String SERVER_KEY = "AAAA-NCJais:APA91b----CENSORED-------";
public static void main(String[] args) {
com.pushraven.Pushraven.setKey(SERVER_KEY);
// create Notification object
Notification raven = new Notification();
HashMap<String, Object> data = new HashMap<String, Object>();
data.put("Hello", "World!");
data.put("Rami", "Imar");
data.put("Test1", "Test2");
// build raven message using the builder pattern
raven.to("/topics/ALL")
.collapse_key("a_collapse_key")
.priority(1)
.delay_while_idle(true)
.time_to_live(100)
.restricted_package_name("com.example.******")
.dry_run(true)
.data(data)
.title("Testing")
.body("Hello World!");
// push the raven message
FcmResponse response = Pushraven.push(raven);
// alternatively set static notification first.
Pushraven.setNotification(raven);
response = Pushraven.push();
// prints response code and message
System.out.println(response);
}
}
错误表示您将消息发送到的令牌无效:
检查传递给服务器的注册令牌的格式。确保它与客户端应用程序通过注册Firebase通知收到的注册令牌匹配。不要截断或添加其他字符
仔细检查要传递给<代码>参数的值。在您的代码中,我看到您正在使用
news
。如果要发送到某个主题,则必须添加前缀/topics/
。所以它应该是类似于/topics/news/
的东西。有关更多详细信息,请参阅。任何其他令牌将导致响应代码:response:401 Success Message:“Error Message:”请求';的身份验证(服务器)密钥包含无效或格式错误的FCM令牌。我检查了很多次,由于这一点,似乎我使用的是正确的令牌。也许错误消息表明Android应用程序无法接收通知?或者错误消息只是指出到Firebase的传输失败?401是在您使用错误的服务器密钥时收到的。您是否绝对肯定您使用的是Firebase控制台的“云消息”选项卡中的服务器密钥,而不是Web API密钥?如果您使用的是正确的服务器密钥,并且仍然收到401,我建议您与联系以深入了解此问题。401错误发生在应用程序服务器和FCM服务器的通信之间,FCM服务器由于未经授权的请求而拒绝邮件。此外,如果使用cURL请求或邮递员发送邮件,您是否可以尝试相同的邮件?请看这里——是的,我正在使用云消息选项卡中的键,它比API键长。我确信我使用了正确的密钥,我还生成了一个新的密钥来尝试它,同样的结果,一旦我从控制台删除了密钥,它会给出一个404消息,而不是200。我将创建一个新的FCM项目来全面测试它,并跟踪它的状态。至于200返回码,这是否意味着我的应用程序服务器和FCM服务器之间的通信存在错误,或者此错误检查是否也扩展到Android应用程序?
public static FcmResponse push(Notification n) {
if(FIREBASE_SERVER_KEY == null){
System.err.println("No Server-Key has been defined.");
return null;
}
HttpsURLConnection con = null;
try{
String url = API_URL;
URL obj = new URL(url);
con = (HttpsURLConnection) obj.openConnection();
con.setRequestMethod("POST");
// Set POST headers
con.setRequestProperty("Authorization", "key="+FIREBASE_SERVER_KEY);
con.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
// Send POST body
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(wr, "UTF-8"));
writer.write(n.toJSON());
writer.close();
wr.close();
wr.flush();
wr.close();
con.getResponseCode();
}
catch(Exception e){
e.printStackTrace();
}
return new FcmResponse(con);
}