【问题标题】:Server to Firebase HTTP POST results in response message 200服务器到 Firebase HTTP POST 导致响应消息 200
【发布时间】:2017-04-10 02:41:08
【问题描述】:

使用 Java 代码(向下滚动查看)我正在使用 FCM 向我的 Android 发送一条通知消息,当提供正确的服务器密钥令牌时,我会收到如下所示的响应消息。

之后从FCM收到以下响应消息
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 建立了某种授权。当我使用不正确的服务器密钥令牌时,我会收到不同的错误消息。但是,上面的消息虽然标记为“成功消息*”,但仍然指出成功值 =0,失败值 =1,错误:无效注册。 如果这确实是一个错误,该错误是否意味着 FCM 未收到通知,或者端点 Android 应用程序未收到通知?

Android 应用

Android 应用程序能够使用控制台接收来自 FCM 的通知。 这是否意味着 Android 应用已设置为从我编写的 Java 服务器接收相同的通知,或者该应用是否需要额外的代码来处理这些不是从控制台发送的通知?

(仅供参考,代码干净,运行无错误,下图并非项目的所有文件,仅显示相关的main函数和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);
    }
}

--------------------------------- 其他文件 ------------ ------------------

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);
}

【问题讨论】:

    标签: java android firebase firebase-cloud-messaging


    【解决方案1】:

    InvalidRegistration 错误表示您发送消息的令牌无效:

    检查您传递给服务器的注册令牌的格式。确保它与客户端应用通过 Firebase 通知注册收到的注册令牌相匹配。不要截断或添加其他字符。

    仔细检查您在 to 参数中传递的值。在您的代码中,我看到您使用的是news。如果您打算发送到 topic,则必须添加前缀 /topics/。所以它应该类似于/topics/news/。有关详细信息,请参阅Topic Messaging docs

    【讨论】:

    • 任何其他令牌将导致响应代码:响应:401 成功消息:''错误消息:'请求的身份验证(服务器-) 密钥包含无效或格式错误的 FCM 令牌。 我检查了很多次,因此似乎我使用了正确的令牌。也许错误消息表明 Android 应用程序没有收到通知?还是错误消息仅指出向 Firebase 的传输失败?
    • 当您使用错误的服务器密钥时收到 401。您是否绝对确定您使用的是在 Firebase 控制台的 Cloud Messaging 选项卡中找到的服务器密钥,而不是 Web API 密钥?
    • 如果您使用了正确的服务器密钥并且仍然收到 401,我建议联系 Firebase support 以深入了解该问题。 401 错误是在您的 App 服务器和 FCM 服务器之间的通信之间,由于未经授权的请求,FCM 服务器正在拒绝该消息。
    • 另外,如果您使用 cURL 请求或使用 Postman 发送消息,您是否可以尝试是否出现相同的消息?见这里——stackoverflow.com/documentation/firebase-cloud-messaging/8242/…
    • 是的,我正在使用云消息选项卡中的密钥,它比 API 密钥长。我很肯定我使用了正确的密钥,我还生成了一个新密钥来尝试它,同样的结果,一旦我从控制台中删除了密钥,它就会给出 404 消息而不是 200。我将创建一个新的 FCM 项目来测试这个彻底并跟进其状态。 对于200返回码,这是否意味着我的App服务器和FCM服务器之间的通信有错误或者这个错误检查也扩展到Android应用程序?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多