2016-04-21 96 views
1

我对这种编程完全陌生,所以我不知道是否已经有答案,但我无法找到它。所以我正在测试,看看我是否可以得到一个干运行的gcm消息而不会出错。错误400 GCM无效请求json

我得到的错误是错误400无效的请求,它是说有关JSON无效,所以我认为这个问题与字符串操作或postdata的定义有关,但我无法想象它出。大多数代码只是复制粘贴,所以人们可以相信,如果他们从同一个源复制,类似情况下的其他人也会得到相同的错误。

而且我已经把“lorem”的实际值。

这是唯一的代码:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Net; 
using System.IO; 
using System.Web.Script.Serialization; 

namespace ServerGMC 
{ 
    public class ServerGMC 
    { 
     static void Main() 
     { 
      // Prepares and calls the function to send message 
      List<string> RedIdList = new List<string>(1) { "aaaaaaaaaaaaaaaaaaaaaaaa" }; 
      RedIdList.TrimExcess(); 
      Console.WriteLine(SendNotification(RedIdList, "HelloWorld", "test", 220299)); 
      Console.Read(); 
     } 
     static public string SendNotification(List<string> deviceRegIds, string message, string title, long id) 
     { 
      try 
      { 
       string regIds = string.Join("\",\"", deviceRegIds); 

       string AppId = "lorem"; 
       var SenderId = "lorem"; 

       NotificationMessage nm = new NotificationMessage(); 
       nm.Title = title; 
       nm.Message = message; 
       nm.ItemId = id; 

       var value = new JavaScriptSerializer().Serialize(nm); 
       WebRequest wRequest; 
       wRequest = WebRequest.Create("https://android.googleapis.com/gcm/send"); 
       wRequest.Method = "post"; 
       wRequest.ContentType = " application/json;charset=UTF-8"; 
       wRequest.Headers.Add(string.Format("Authorization: key={0}", AppId)); 
       wRequest.Headers.Add(string.Format("Sender: id={0}", SenderId)); 

       string postData = "{\"collapse_key\":\"standard\",\"time_to_live\":108,\"delay_while_idle\":true,\"dry_run\":true,\"data\": { \"message\" : " + "\"" + value + "\",\"time\": " + "\"" + System.DateTime.Now.ToString() + "\"},\"registration_ids\":[\"" + regIds + "\"]}"; 
       //string postData = "collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.message=" + value + "&date.time=" + System.DateTime.Now.ToString() + "&registration_ids=" + regIds + ""; 
       Console.WriteLine(postData); 

       Byte[] bytes = Encoding.UTF8.GetBytes(postData); 
       wRequest.ContentLength = bytes.Length; 

       Stream stream = wRequest.GetRequestStream(); 
       stream.Write(bytes, 0, bytes.Length); 
       stream.Close(); 

       WebResponse wResponse = wRequest.GetResponse(); 

       stream = wResponse.GetResponseStream(); 

       StreamReader reader = new StreamReader(stream); 

       String response = reader.ReadToEnd(); 

       HttpWebResponse httpResponse = (HttpWebResponse)wResponse; 
       string status = httpResponse.StatusCode.ToString(); 

       reader.Close(); 
       stream.Close(); 
       wResponse.Close(); 

       if (status == "") 
       { 
        return response; 
       } 
       else 
       { 
        return ""; 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
       Console.WriteLine(); 
       return ""; 
      } 
     } 
     private class NotificationMessage 
     { 
      public string Title; 
      public string Message; 
      public long ItemId; 
     } 
    } 
} 
+0

你可以发布'postData'字符串的控制台日志吗?我在猜测它引起问题的'value'或'regIds'的串联。 – adjuremods

+0

@adjuremods {“collapse_key”:“standard”,“time_to_live”:108,“delay_while_idle”:true,“dry_run”:true,“data”:{“message”:“{”Title“:”test“ Message“:”HelloWorld“,”ItemId“:220299}”,“time”:“22/04/2016 13:04:38”},“registration_ids”:[“aaaaaaaaaaaaaaaaaaaaaaaa”]} –

回答

0

postData格式不正确的JSON。如果你检查它使用一个在线格式化工具,它看起来像这样

{ 
    "collapse_key":"standard", 
    "time_to_live":108, 
    "delay_while_idle":true, 
    "dry_run":‌​true, 
    "data":{ 
     "message":"{"Title":"test", 
     "Message":"HelloWorld", 
     "ItemId":220299}", 
     "time":"22/04/2016 13:04:38" 
    }, 
    "registration_ids":["aaaaaaaaaaaaaaaaaaaaaaaa"] 
} 

您可以删除data.message节点,并放置在data其属性,或者使用第三方JSON解析器或System.Web.Helpers.Json.Decode(这些建议在this issue

希望这有助于解决这个问题。

快乐编码!

+0

非常感谢!我只使用纯文本格式进行工作,但随着gcm更好地使用它,我将再次切换到JSON。 –