1

我正在尝试发送和接收 JSON GCM 消息,但在客户端它似乎总是以 UTF8 的形式出现。

protected HttpURLConnection post(String url, String contentType, String body)
throws IOException {
    Print.logInfo("In HttpURLConnection: " + contentType + body);
    byte[] bytes = body.getBytes();
    HttpURLConnection conn = getConnection(url);
    conn.setDoOutput(true);
    conn.setUseCaches(false);
    conn.setFixedLengthStreamingMode(bytes.length);
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Type", contentType);
    conn.setRequestProperty("Authorization", "key=" + key);
    OutputStream out = conn.getOutputStream();
    out.write(bytes);
    out.close();
    return conn;
}

在服务器上,UTF8 消息是: 在 HttpURLConnection: application/x-www-form-urlencoded;charset=UTF-8registration_id=APA91...&delay_while_idle=0&collapse_key=Test&time_to_live=2419200&data.Data1=Value+1&data.Data2=Value+2&data .Data3=值+3

并且 JSON 消息是:在 HttpURLConnection: application/json{"delay_while_idle":false,"collapse_key":"Test","data":{"Data1":"Value 1","Data2":"Value 2", "Data3":"Value 3"},"time_to_live":2419200,"registration_ids":["APA91..."]}

多播结果 MulticastResult(multicast_id=5036...,total=1,success=1,failure=0,canonical_ids=0,results: [[ messageId=0:1362.. ]]:

两条消息都在客户端成功接收,但我无法识别 json 格式。

@Override
protected void onMessage(Context context, Intent intent) {
    Log.i(TAG, "Received message");
    String inAction = intent.getAction();
    // check to see if it is a message
    if (inAction.equals("com.google.android.c2dm.intent.RECEIVE")) {
        // if your key/value is a JSON string, extract and parse it using JSONObject
        String json_info = intent.getExtras().getString("data");
        if (json_info != null) {
            try {
                JSONObject jsonObj = new JSONObject(json_info);
                payload = jsonObj.get("Data1")  + "\n"
                        + jsonObj.get("Data2")+ "\n"
                        + jsonObj.get("Data3");
                }
            catch (JSONException e) {
                // do nothing
                return;
            }
        }
        else {
            payload = intent.getStringExtra("Data1")  + "\n"
                    + intent.getStringExtra("Data2")+ "\n"
                    + intent.getStringExtra("Data3");
            }
    }
}

在这两种情况下 json_info 都是空的。我在运行 apache/tomcat 的服务器上使用 java servlet。

请帮忙。非常感谢

4

1 回答 1

5

JSON 对象仅用于您的服务器与 GCM 服务器的通信。该应用程序永远不会获取 JSON 对象。通知的数据作为键/值对传递。如果出于某种原因想要传递 JSON 有效负载,则应将其编码为字符串并将该字符串作为dataJSON 对象内的键/值对之一的值传递。然后,您必须从意图中的附加内容中读取该值并解析 JSON。

onMessage(Context context, Intent intent):当你的服务器向 GCM 发送消息时调用,GCM 将消息传递给设备。如果消息具有有效负载,则其内容可用作意图中的附加内容。

实际上,这句话更相关:

数据

一个 JSON 对象,其字段表示消息有效负载数据的键值对。如果存在,有效负载数据将作为应用程序数据包含在 Intent 中,键是额外的名称。例如,"data":{"score":"3x1"} 将导致一个意图额外命名的分数,其值为字符串 3x1。键/值对的数量没有限制,但消息的总大小(4kb)有限制。这些值可以是任何 JSON 对象,但我们建议使用字符串,因为无论如何这些值都会在 GCM 服务器中转换为字符串。如果要包含对象或其他非字符串数据类型(如整数或布尔值),则必须自己转换为字符串。另请注意,密钥不能是保留字(from 或任何以 google. 开头的单词)。让事情稍微复杂一点的是,在有效载荷数据中技术上允许使用一些保留字(例如 collapse_key)。但是,如果请求中还包含该单词,则请求中的值将覆盖有效负载数据中的值。因此,即使在技术上允许的情况下,也不建议使用在此表中定义为字段名称的词。选修的。即使在技术上允许的情况下。选修的。即使在技术上允许的情况下。选修的。

于 2013-03-10T00:03:22.737 回答