2

I'm trying to send the following request:

 POST /messaging/registrations/(REGISTRATION_ID_FOR_DESTINATION_APP_INSTANCE)/messages   HTTP/1.1
 Host: api.amazon.com
 Authorization: Bearer (MY_ACCESS_TOKEN)
 Content-Type: application/json
 X-Amzn-Type-Version: com.amazon.device.messaging.ADMMessage@1.0
 Accept: application/json
 X-Amzn-Accept-Type: com.amazon.device.messaging.ADMSendResult@1.0
 
 {
"data":{"message":"value1","title":"value2"},
"consolidationKey":"Some Key",
"expiresAfter":86400
 }

in order to get a response format like this:

 HTTP/1.1 200
 X-Amzn-Data-md5: t5psxALRTM7WN30Q8f20tw==
 X-Amzn-RequestId: e8bef3ce-242e-11e2-8484-47f4656fc00d
 Content-Type: application/json
 X-Amzn-Type-Version: com.amazon.device.messaging.ADMSendResult@1.0
 Content-Length: 308
  
 {"registrationID":(REGISTRATION_ID_FOR_DESTINATION_APP_INSTANCE)}

to do that I tried with this code:

private void sendNotification(String registrationID,String message,
                                          String title,String accessToken)
{     
 //registrationID content (REGISTRATION_ID_FOR_DESTINATION_APP_INSTANCE) that can vary
 string url = "https://api.amazon.com/messaging/registrations/"+ registrationID +"/messages";

 var client = new HttpClient();

 //set Request headers 
 client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
                                                      "Bearer", accessToken);
 client.DefaultRequestHeaders.Accept.Add(
             new MediaTypeWithQualityHeaderValue("application/json"));
 client.DefaultRequestHeaders.Add("X-Amzn-Type-Version",
                                "com.amazon.device.messaging.ADMMessage@1.0");
 client.DefaultRequestHeaders.Add("X-Amzn-Accept-Type",
                            "com.amazon.device.messaging.ADMSendResult@1.0");

 //the content of the message body

 var content = new Dictionary<string, Object>();
 content.Add("consolidationKey", "SyncNow");
 content.Add("expiresAfter", 86400);
 var data = new Dictionary<string, string>();
 data.Add("message", message);
 data.Add("title", title);
 content.Add("data", data);

       
 var result = client.PostAsJsonAsync<Dictionary<string, Object>>(url, content).Result;
}

As response I get StatusCode:400,ReasonPhrase:'Bad Request', I don't know why?

For detail about result which I got:

  result    {StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
 {
  x-amzn-RequestId: 1b943a1c-fe94-11e2-b963-71a537223b43
  Vary: Accept-Encoding
  Vary: User-Agent
  Cneonction: close
  Date: Tue, 06 Aug 2013 12:31:24 GMT
  Content-Length: 34
  Content-Type: application/json
 }}    System.Net.Http.HttpResponseMessage

 result.RequestMessage  {Method: POST, 
 RequestUri: 'https://api.amazon.com/messaging/registrations/(REGISTRATION_ID_FOR_DESTINATION_APP_INSTANCE)/messages', 
 Version: 1.1, 
 Content: System.Net.Http.ObjectContent`1[[System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],
 [System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], 
 Headers:
 {
  Authorization: Bearer (MY_ACCESS_TOKEN)
  Accept: application/json
  X-Amzn-Type-Version: com.amazon.device.messaging.ADMMessage@1.0
  X-Amzn-Accept-Type: com.amazon.device.messaging.ADMSendResult@1.0
  Content-Type: application/json; charset=utf-8
  Content-Length: 98
 }}       System.Net.Http.HttpRequestMessage
Jason Aller
  • 3,541
  • 28
  • 38
  • 38
mouhcine
  • 131
  • 1
  • 3
  • 13

2 Answers2

7

I found an other solution that work perfectly .

private void sendNotification(String registrationID,String message,String title,String accessToken)
    {
       HttpWebRequest httpWReq =
            (HttpWebRequest)WebRequest.Create("https://api.amazon.com/messaging/registrations/" + registrationID + "/messages");

        Encoding encoding = new UTF8Encoding();
        string postData = "{\"data\":{\"message\":\""+message+"\",\"title\":\""+title+"\"},\"consolidationKey\":\"Some Key\",\"expiresAfter\":86400}";
        byte[] data = encoding.GetBytes(postData);

        httpWReq.ProtocolVersion = HttpVersion.Version11;
        httpWReq.Method = "POST";
        httpWReq.ContentType = "application/json";//charset=UTF-8";
        httpWReq.Headers.Add("X-Amzn-Type-Version",
                                           "com.amazon.device.messaging.ADMMessage@1.0");
        httpWReq.Headers.Add("X-Amzn-Accept-Type",
                                        "com.amazon.device.messaging.ADMSendResult@1.0");
        httpWReq.Headers.Add(HttpRequestHeader.Authorization,
            "Bearer " + accessToken);
        httpWReq.ContentLength = data.Length;


        Stream stream = httpWReq.GetRequestStream();
        stream.Write(data, 0, data.Length);
        stream.Close();

        HttpWebResponse response = (HttpWebResponse)httpWReq.GetResponse();
        string s=response.ToString();
        StreamReader reader = new StreamReader(response.GetResponseStream());
        String jsonresponse = "";
        String temp = null;
        while ((temp = reader.ReadLine()) != null)
        {
            jsonresponse += temp;
        }

    }
mouhcine
  • 131
  • 1
  • 3
  • 13
0

Just looking at this quickly it seems like this line of code is wrong.

var result = client.PostAsJsonAsync<Dictionary<string, Object>>(url, data).Result;

based on fact that you're saying amazon wants the post json to look like this.

 {"data":{"message":"value1","title":"value2"},"consolidationKey":"Some Key","expiresAfter":86400}

It seems like you should be passing your var content to the post rather than var data. I.e.

 var result = client.PostAsJsonAsync<Dictionary<string, Object>>(url, content).Result;
cgotberg
  • 2,045
  • 1
  • 18
  • 18
  • yes, it's already done, I correct it. but I have the same error response. – mouhcine Aug 06 '13 at 15:53
  • I don't see anything obviously wrong in your code. You might want to download and run a proxy like fiddler and set it up to work with https and see what's actually being sent across the wire. Maybe something weird is going on with the headers, but it's tough to say without being able to actually look at what's being sent and returned. Usually a bad request is because something is wrong with the json post. – cgotberg Aug 06 '13 at 16:34