2016-04-21 9 views
1

Ich bin völlig neu in dieser Art von Programmierung, so dass ich nicht wirklich weiß, ob es eine Antwort auf diese bereits gibt, aber ich konnte es nicht finden. So teste ich, um zu sehen, ob ich eine Trockenlauf-gcm-Nachricht erhalten kann, um ohne Fehler zu arbeiten.Fehler 400 GCM ungültige Anfrage json

Der Fehler, den ich bekomme, ist der Fehler 400 Invalid Request, und es sagt etwas über die JSON ist ungültig, so habe ich angenommen, dass das Problem mit String-Manipulation oder die Definition von Postdaten hat, aber ich kann es nicht fassen aus. Der Großteil des Codes wird sowieso nur kopiert, so dass man glauben könnte, dass andere in einer ähnlichen Situation den gleichen Fehler bekommen, wenn sie aus der gleichen Quelle kopieren.

Und auch ich habe tatsächliche Werte für die "Lorem" s.

Dies ist der einzige Code:

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

Können Sie das Konsolenprotokoll der Zeichenfolge 'postData' veröffentlichen? Ich vermute es ist die Verkettung der "Wert" oder "regIds" darin, die das Problem verursacht. – adjuremods

+0

@adjuremods {"collapse_key": "Standard", "time_to_live": 108, "delay_while_idle": true, "dry_run": true, "Daten": {"message": "{" Title ":" test "," " Nachricht ":" HelloWorld "," ItemId ": 220299}", "time": "22.04.2016 13:04:38"}, "registration_ids": ["aaaaaaaaaaaaaaaaaaaaaaaa"]} –

Antwort

0

Die postData nicht richtig in JSON formatiert ist. Wenn Sie es ausprobieren ein Online-Formatierung-Tool, es ist wie dieses

{ 
    "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"] 
} 

sieht können Sie entweder den data.message Knoten entfernen und seine Eigenschaften in data, oder verwenden Sie eine 3rd-Party-JSON-Parser oder System.Web.Helpers.Json.Decode (die vorgeschlagen wurden in this issue)

Hoffentlich hilft das mit dem Problem.

Glückliche Codierung!

+0

Vielen Dank! Ich hatte es mit der Verwendung von Nur-Text-Formatierung funktioniert, aber ich werde wieder zu JSON wechseln, da gcm besser damit arbeiten. –

Verwandte Themen