向 GCM 发送请求会导致 JSON_PARSIN_ERROR

Posted

技术标签:

【中文标题】向 GCM 发送请求会导致 JSON_PARSIN_ERROR【英文标题】:Sending request to GCM results in a JSON_PARSIN_ERROR 【发布时间】:2015-01-29 16:01:50 【问题描述】:

我需要编写一个向 iosandroid 设备发送推送通知的服务器。

我可以成功地向 iOS 发送通知。幸运的是,实现这部分很轻松。

我在任务中最简单的部分遇到了问题:Android。

我配置了 GCM,Android 设备成功注册到服务器。

当我尝试向设备发送推送时,我收到以下错误:

STATUS: 400
JSON_PARSING_ERROR: Unexpected token END OF FILE at position 0.

这里是发送请求的代码。

AndroidPush push = new AndroidPush();
push.getRegids().add(token);
push.getData().setMessage(message);
push.getData().setMsgcnt(String.format("%d", (badge + 1)));

URL u = new URL(androidEndpoint);
HttpsURLConnection conn = null;
OutputStream os = null;
OutputStreamWriter osw = null;
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
try

    conn = (HttpsURLConnection)u.openConnection();

    conn.setDoInput(true);
    conn.setDoOutput(true);
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Type", androidContentType);
    conn.setRequestProperty("Authorization", androidAuthorization);

    conn.connect();

    os = conn.getOutputStream();
    osw = new OutputStreamWriter(os);   

    System.out.println(push.toJSON());
    osw.write(push.toJSON());

    int status = conn.getResponseCode();
    System.err.println("STATUS: "+status);
    if(status == 200)
        is = conn.getInputStream();
     else 
        is = conn.getErrorStream();
    
    isr = new InputStreamReader(is);
    br = new BufferedReader(isr); 
    StringBuilder sb = new StringBuilder();
    String read = null;
    do 
        read = br.readLine();
        if(read != null)
            sb.append(read);
     while (read != null);

    if(status != 200)
        System.err.println(sb.toString());
     else 
        System.out.println(sb.toString());
    

 catch(IOException ex) 
    ex.printStackTrace();
    throw ex;
 finally 
    if(isr != null)
        isr.close();
    if(is != null)
        is.close();
    if(osw != null)
        osw.close();
    if(os != null)
        os.close();
    if(conn != null)
        conn.disconnect();

地点:

androidEndpoint = "https://android.googleapis.com/gcm/send";
androidContentType = "application/json";
androidAuthorization = "key=<mykey>";

并且 push.toJSON() 方法的输出是以下字符串:


    "registration_ids" : ["APA91bEmD8T9NxQj07uhbTAsD1GTWvT7L_no1SXP70YWaQGPX6VO73pdAOa53PN-hyAyy-3erItWxLDb8W1aQ2nh3np0NttJ5g66w2-142d4bXTCsmrF34-J7rWw4IUObutQznaml59XdfweiEGKzv1Otp3quffUEA"],
    "data" : 
        "message":"Push di prova",
        "msgcnt":"13"
     

我看不出有什么不对...我错过了什么?

感谢您的帮助,

【问题讨论】:

你找到答案了吗? 【参考方案1】:

使用 php 开发解决方案时,当消息中包含元音变音符号(例如 äöü)时,我总是收到相同的错误。 没有消息通过并到达接收者。

最终解决方案是utf8_encode( 'your text here äöä' ) 您的外发字符串(消息、标题等)。

花费我至少几个小时来检测“错误”。

【讨论】:

【参考方案2】:

是不是你少了下面粗体显示的','


    "registration_ids" : ["APA91bEmD8T9NxQj07uhbTAsD1GTWvT7L_no1SXP70YWaQGPX6VO73pdAOa53PN-hyAyy-3erItWxLDb8W1aQ2nh3np0NttJ5g66w2-142d4bXTCsmrF34-J7rWw4IUObutQznaml59XdfweiEGKzv1Otp3quffUEA"],
    "data" : 
        "message":"Push di prova",
        "msgcnt":"13"**,**
     **,**

参考此链接中给出的消息:http://developer.android.com/google/gcm/adv.html#payload

【讨论】:

但从技术上讲...您的 JSON 无效,不是吗?我的意思是:据我所知,最后一个字段的值后面不应该有任何逗号..

以上是关于向 GCM 发送请求会导致 JSON_PARSIN_ERROR的主要内容,如果未能解决你的问题,请参考以下文章

向 Http GCM 服务器发送帖子时的响应时间非常长

GCM 和 WNS 禁止向非活动设备发送推送通知的策略

如何通过xmpp gcm将ack从android应用程序发送到服务器

向 iOS 设备发送数据消息会导致 FirebaseMessagingException:请求包含无效参数

通过 POST 请求向 Discord 频道发送消息会导致代码 401

使用 Swift 向 Discord Webhook 发送 HTTP POST 请求会导致响应错误