1

我正在大修我的应用程序的某些部分以使用新的 GCM 服务来替换 C2DM。我只是想从 Java 程序创建 JSON 请求以进行测试,然后读取响应。截至目前,我找不到我的 JSON 请求的任何格式问题,并且谷歌服务器总是返回代码 400,这表明我的 JSON 有问题。 http://developer.android.com/guide/google/gcm/gcm.html#server

JSONObject obj = new JSONObject();
    obj.put("collapse_key", "collapse key");
    JSONObject data = new JSONObject();
    data.put("info1", "info_1");
    data.put("info2", "info 2");
    data.put("info3", "info_3");
    obj.put("data", data);
    JSONArray ids = new JSONArray();
    ids.add(REG_ID);
    obj.put("registration_ids", ids);
    System.out.println(obj.toJSONString());

我将请求打印到 Eclipse 控制台以检查其格式

byte[] postData = obj.toJSONString().getBytes();
    try{
    URL url = new URL("https://android.googleapis.com/gcm/send");
    HttpsURLConnection.setDefaultHostnameVerifier(new JServerHostnameVerifier());
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
    conn.setDoOutput(true);
    conn.setDoInput(true);
    conn.setUseCaches(false);

    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Type", "application/json");

conn.setRequestProperty("Authorization", "key=" + API_KEY);
    System.out.println(conn.toString());
    OutputStream out = conn.getOutputStream();
              // exception thrown right here. no InputStream to get
    InputStream in = conn.getInputStream();
    byte[] response = null;
    out.write(postData);
    out.close();
    in.read(response);
    JSONParser parser = new JSONParser();
    String temp = new String(response);
    JSONObject temp1 = (JSONObject) parser.parse(temp);
    System.out.println(temp1.toJSONString());
    int responseCode = conn.getResponseCode();
     System.out.println(responseCode + "");
    } catch(Exception e){
        System.out.println("Exception thrown\n"+ e.getMessage());
    }


}

我确定我的 API 密钥是正确的,因为这会导致错误 401,所以说谷歌文档。这是我第一次使用 JSON,但由于它的简单性,它很容易理解。有人对我为什么总是收到代码 400 有任何想法吗?

更新:我已经测试了 gcm 提供的谷歌服务器示例类,所以问题一定出在我的代码上。

{"collapse_key":"new-test-notification","data":{"info1":"info_1","info3":"info_3","info2":"info 2"},"registration_ids":["APA91bG3bmCSltzQYl_yOcjG0LPcR1Qemwg7osYJxImpSuWZftmmIjUGH_CSDG3mswKuV3AAb8GSX7HChOKGAYHz1A_spJus5mXFtfOrK0fouBD7QBpKnfc_ly0t3S8vSYWRjuGxtXrt"]}
4

3 回答 3

1

我使用不同的方法解决了它,所以它一定是我最初的实现。

List<NameValuePair> list = new ArrayList<NameValuePair>();
        list.add(new BasicNameValuePair("username",username));
        list.add(new BasicNameValuePair("deviceId",regId));
        list.add(new BasicNameValuePair("deviceType","AndroidPhone"));
        DefaultHttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost("example.url.com");
        post.setEntity(new UrlEncodedFormEntity(list));
        ResponseHandler<String> handler = new BasicResponseHandler();
        HttpResponse response = client.execute(post);
        String responseString = handler.handleResponse(response);
        JSONObject jsonResponse = new JSONObject(responseString);
于 2012-07-09T15:10:28.830 回答
0

我在这里读到您应该将“浏览器应用程序密钥” GCM 与 PHP(谷歌云消息传递)一起使用(在评论中)

于 2012-07-03T09:14:33.163 回答
0

尝试使用 curl 或其他命令行工具重现错误,这样我们就可以消除您的 java 中存在我们都遗漏的错误的可能性。

于 2012-07-07T19:11:17.097 回答