发送 gcm 消息的错误请求

Posted

技术标签:

【中文标题】发送 gcm 消息的错误请求【英文标题】:Bad Request sending gcm message 【发布时间】:2012-08-12 12:16:09 【问题描述】:

我正在尝试通过 C# 发送 gcm 消息。

我尝试了几次,但在尝试以 json 方法发送时得到http:400-Bad request

当我尝试以文本形式发送时,我无法阅读(rtl 语言) - 这就是我尝试 JSON 的原因。

有人知道是什么问题吗? 谢谢!

 私有静态字符串 SendNotificationJson2(string id, string msg)
    
            var AuthString = "AIzaSyDAtmaqSdutBQemqmd4dQgf33B_6ssbvXA";
            var RegistrationID = id;
            var 消息 = 味精;


        //-- 创建 C2DM Web 请求对象的 GCM 请求 --//
        HttpWebRequest 请求 = (HttpWebRequest)WebRequest.Create("https://android.googleapis.com/gcm/send");

        Request.Method = "POST";
        Request.KeepAlive = false;

        //-- 创建查询字符串 --//
        字典 dict = new Dictionary();
        dict.Add("registration_ids", RegistrationID);
        dict.Add("数据", 消息);
        dict.Add("collapse_key", "1");

        字符串 postData = GetPostStringFrom(dict);
        byte[] byteArray = Encoding.UTF8.GetBytes(postData);

        Request.ContentType = "应用程序/json";
        Request.ContentLength = byteArray.Length;


        Request.Headers.Add("授权", "key=" + AuthString);

        //-- 委托建模以验证服务器证书 --//
        ServicePointManager.ServerCertificateValidationCallback += 委托(
                    目的
                    发件人,
                    System.Security.Cryptography.X509Certificates.X509Certificate
                    p证书,
                    System.Security.Cryptography.X509Certificates.X509Chain pChain,
                    System.Net.Security.SslPolicyErrors pSSLPolicyErrors)
        
            返回真;
        ;

        //-- 创建流以写入字节数组 --//
        流数据流 = Request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        数据流。关闭();

        //-- 发布消息--//
        WebResponse 响应 = Request.GetResponse();
        HttpStatusCode ResponseCode = ((HttpWebResponse)Response).StatusCode;
        if (ResponseCode.Equals(HttpStatusCode.Unauthorized) || ResponseCode.Equals(HttpStatusCode.Forbidden))
        
            返回“未经授权 - 需要新令牌”;

        
        否则如果(!ResponseCode.Equals(HttpStatusCode.OK))
        
            返回“来自网络服务的响应不正常”;
            //Console.WriteLine("来自 Web 服务的响应不正常:");
            //Console.WriteLine(((HttpWebResponse)Response).StatusDescription);
        

        StreamReader Reader = new StreamReader(Response.GetResponseStream());
        字符串 responseLine = Reader.ReadLine();
        Reader.Close();

        返回“确定”;
    

    私有静态字符串 GetPostStringFrom(Dictionary postFieldNameValue)
    
        // return Newtonsoft.Json.JsonConvert.SerializeObject(postFieldNameValue);
        return "\"data\": \"Message\": \"" + postFieldNameValue["data"] + "\",\"registration_ids\":[\"" + postFieldNameValue["registration_ids"] + " \"]";
    

【问题讨论】:

【参考方案1】:

您忘记了 Json 数据中的第一个括号

使用

return "\"data\": \"Message\": \"" +  postFieldNameValue["data"] + "\",\"registration_ids\":[\"" +  postFieldNameValue["registration_ids"] + "\"]";

而不是

return "\"data\": \"Message\": \"" +  postFieldNameValue["data"] + "\",\"registration_ids\":[\"" +  postFieldNameValue["registration_ids"] + "\"]";

【讨论】:

【参考方案2】:

您的注册 ID 需要是 JSON 数组,因此请使用列表而不是单个字符串。

【讨论】:

以上是关于发送 gcm 消息的错误请求的主要内容,如果未能解决你的问题,请参考以下文章

接收 GCM 时出现错误消息

在 GCM 中发送推送通知时出现未经授权的错误

GCM 错误代码

GCM http 401 授权错误

Google API 客户端错误,发送位置

GCM 不同的发件人 ID 不匹配发件人 ID 错误