【问题标题】:HTTP code 400 returned while communication with GCM与 GCM 通信时返回 HTTP 代码 400
【发布时间】:2014-12-18 11:43:16
【问题描述】:

我正在尝试为 GCM 通信实现 HTTP 服务器。提供正确的密钥后,我得到的 HTTP 响应代码为“400”。这是代码sn-p:

URL url = new URL("https://android.googleapis.com/gcm/send");
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.sgp.com", 8080));
        HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setRequestProperty("Authorization", "key="+"AIzaSyAYc53L6kg_XerwoWdLjUAi2iEfNKidSF8");
        conn.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
        wr.writeUTF("{\"collapse_key\" : \"Food-Promo\", \"data\" : {\"Category\" : \"FOOD\",\"Type\": \"VEG\",}, \"registration_ids\": [\"APA91bEk7GPFVxzOidvB3JKCMWq3FHpAaTj2dBv9VGOQkKtLAEiVGR8TDi1fsU4D1k293ODAFTJ8dNfE2gzJNfCvB1sjewZu2fGOIJmY8dgjcNTZQYi4QfyQH-AaO0qEmQnbEeEtsUQ5LzWrIHboAhJMx1bfdsO9bg\"]}");
        wr.flush();
        wr.close();
        int responseCode = conn.getResponseCode();

有人可以帮忙吗?

【问题讨论】:

  • 你的 json 无效
  • right json "{\"collapse_key\": \"Food-Promo\",\"data\": {\"Category\": \"FOOD\",\"Type\" : VEG\"},\"registration_ids\":[ \"APA91bEk7GPFVxzOidvB3JKCMWq3FHpAaTj2dBv9VGOQkKtLAEiVGR8TDi1fsU4D1k293ODAFTJ8dNfE2gzJNfCvB1sjewZu2fGOIJmY8dgjcNTZQYi4QfyQH-AaO0qEmQnbEeEtsUQ5LzWrIHboAhJMx1bfdsO9bg\"]}"

标签: android apache http google-cloud-messaging


【解决方案1】:

400 错误仅出现在以下情况:

仅适用于 JSON 请求。 Indicates that the request could not be parsed as JSON,或者它包含无效字段(例如,在需要数字的地方传递字符串)。响应中描述了确切的失败原因,并且应该在重试请求之前解决问题。 Reference

所以你可以试试这个代码,它对我有用

为 GCM 的标准消息格式创建一个 POJO 类

public class Content implements Serializable {

public List<String> registration_ids;
public Map<String,String> data;

public void addRegId(String regId){
    if(registration_ids == null)
        registration_ids = new LinkedList<String>();
    registration_ids.add(regId);
}

public void createData(String title, String message){
    if(data == null)
        data = new HashMap<String,String>();

    data.put("title", title);
    data.put("message", message);
}

}

请求 GCM 向安卓设备发送通知消息的代码,

   String apiKey = ""; //API key provided by Google Console
   String deviceID="";//Device Id
   Content content = new Content();
   //POJO class as above for standard message format
   content.addRegId(deviceID);       
   content.createData("Title", "Notification Message");
   URL url = new URL("https://android.googleapis.com/gcm/send");
   HttpURLConnection conn = (HttpURLConnection) url.openConnection();
   conn.setRequestMethod("POST");
   conn.setRequestProperty("Content-Type", "application/json");
   conn.setRequestProperty("Authorization", "key="+apiKey);
   conn.setDoOutput(true);
   ObjectMapper mapper = new ObjectMapper();
   DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
   mapper.writeValue(wr, content);
   wr.flush();
   wr.close();
   responseCode = conn.getResponseCode();

希望这可以帮助您解决问题...!!!!!!

【讨论】:

  • 工作!非常感谢:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多