如何在以下上下文中从响应中获取规范 ID?

Posted

技术标签:

【中文标题】如何在以下上下文中从响应中获取规范 ID?【英文标题】:How to get the canonical ids from the response in the following context? 【发布时间】:2015-12-30 05:40:21 【问题描述】:

我对 GCM 完全陌生,我使用以下方法向 GCM 服务器发送消息。

 public string SendMessage(string RegistrationID, string Message, string AuthString)
                
        //-- Create C2DM Web Request Object --//
        HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://android.clients.google.com/c2dm/send");
        Request.Method = "POST";
        Request.KeepAlive = false;

        //-- Create Query String --//
        NameValueCollection postFieldNameValue = new NameValueCollection();
        postFieldNameValue.Add("registration_id", RegistrationID);
        postFieldNameValue.Add("collapse_key", "1");
        postFieldNameValue.Add("delay_while_idle", "0");
        // postFieldNameValue.Add("data.message", Message);
        postFieldNameValue.Add("data.payload", Message);           
        string postData = GetPostStringFrom(postFieldNameValue);
        byte[] byteArray = Encoding.UTF8.GetBytes(postData);


        Request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
        Request.ContentLength = byteArray.Length;

        Request.Headers.Add(HttpRequestHeader.Authorization, "GoogleLogin auth=" + AuthString);

        //-- Delegate Modeling to Validate Server Certificate --//
        ServicePointManager.ServerCertificateValidationCallback += delegate(
                    object
                    sender,
                    System.Security.Cryptography.X509Certificates.X509Certificate
                    pCertificate,
                    System.Security.Cryptography.X509Certificates.X509Chain pChain,
                    System.Net.Security.SslPolicyErrors pSSLPolicyErrors)
        
            return true;
        ;

        //-- Create Stream to Write Byte Array --// 
        Stream dataStream = Request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();

        //-- Post a Message --//
        WebResponse Response = Request.GetResponse();
        HttpStatusCode ResponseCode = ((HttpWebResponse)Response).StatusCode;
        if (ResponseCode.Equals(HttpStatusCode.Unauthorized) || ResponseCode.Equals(HttpStatusCode.Forbidden))
                        
            return "Unauthorized - need new token";

        
        else if (!ResponseCode.Equals(HttpStatusCode.OK))
        
            return "Response from web service isn't OK";
            //Console.WriteLine("Response from web service not OK :");
            //Console.WriteLine(((HttpWebResponse)Response).StatusDescription);
        

        StreamReader Reader = new StreamReader(Response.GetResponseStream());
        string responseLine = Reader.ReadLine();

        Reader.Close();

        return responseLine;
    

在这种情况下,我需要处理规范 ID。我看到下面的代码 sn-p 可以在 Java 中使用。

if (result.getMessageId() != null) 
 String canonicalRegId = result.getCanonicalRegistrationId();
 if (canonicalRegId != null) 
   // same device has more than on registration ID: update database
 
 else 
 String error = result.getErrorCodeName();
 if (error.equals(Constants.ERROR_NOT_REGISTERED)) 
  // application has been removed from device - unregister database


但是我怎样才能在 C# 中实现同样的效果呢?它没有 getCanonicalIds 方法,因为它是我得到的标准 Web 响应。如何找到规范 id 并将它们从表中删除?请指教。

【问题讨论】:

【参考方案1】:

canonical Id 是已在不同 Id 下注册的设备的 Id。当您没有此类 ID 时,canonical_ids 元素将为您提供 0。但如果它有一个值,那么您在响应中的 canonical_ids 元素将显示计数。在您的回复中,这些 ID 将显示为“registration_id”。这些将按照请求发送的顺序排列。因此,如果您的响应字符串的第 3 和第 4 个元素具有“registration_ids”的值,则意味着您在请求中发送的第 3 和第 4 个元素 id 不是正确的。将表中的它们替换为响应中“registration_ids”中提供的 ID。下面是从 C# 代码中获取这些索引和 ID 的代码。

class Program

    static void Main(string[] args)
    
        List<String> ids = new List<String>();
        String json ="\"multicast_id\": \"xxxxx\",\"success\": 7,\"failure\": 0,\"canonical_ids\": 2,\"results\": [\"message_id\": \"0:xxx%xxxxx\", \"message_id\": \"0:xxx%xxxxx\", \"registration_id\": \"456\",\"message_id\": \"0:xxx%xxxxx\", \"message_id\": \"0:xxx%xxxxx\", \"message_id\": \"0:xxx%xxxxx\", \"registration_id\": \"123\",\"message_id\": \"0:xxx%xxxxx\", \"message_id\": \"0:xxx%xxxxx\"]";
        RootObject decryptedMessage = new javascriptSerializer().Deserialize<RootObject>(json);
        int position = 0;
        Dictionary<int, String> canonicalIdsAndIndexes = new Dictionary<int, string>();
        foreach (var item in decryptedMessage.results)
        
            if (item.registration_id != null)
            
                canonicalIdsAndIndexes.Add(position, item.registration_id);
                Console.WriteLine("message id: 0, registrationid: 1", item.message_id, item.registration_id);
            
            position++;

        
        Console.ReadLine();
    


public class Result

    public string message_id  get; set; 
    public string registration_id  get; set; 


public class RootObject

    public string multicast_id  get; set; 
    public int success  get; set; 
    public int failure  get; set; 
    public int canonical_ids  get; set; 
    public List<Result> results  get; set; 

【讨论】:

以上是关于如何在以下上下文中从响应中获取规范 ID?的主要内容,如果未能解决你的问题,请参考以下文章

Gatsby:如何将多个上下文 ID 传递给单个查询?

无法在 JBoss 的上下文中从客户端应用程序获取远程 ejb

我可以在 spring 应用程序上下文中从 jpa 获取 jdbc 数据源吗?

我们如何在 Flutter 中从 JSON 对象中获取特定数据?

APPIUM ANDROID 混合应用程序:在混合应用程序中从本机导航到 Web 视图时,无法将驱动程序上下文获取为“WEBVIEW”

如何在 servlet 上下文中从 jar 文件中读取 xml 模式