send post Https request with Content Type application Json on C#

26,014

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",
                                           "[email protected]");
        httpWReq.Headers.Add("X-Amzn-Accept-Type",
                                        "[email protected]");
        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;
        }

    }
Share:
26,014
mouhcine
Author by

mouhcine

Updated on April 04, 2021

Comments

  • mouhcine
    mouhcine about 3 years

    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: [email protected]
     Accept: application/json
     X-Amzn-Accept-Type: [email protected]
     
     {
    "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: [email protected]
     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",
                                    "[email protected]");
     client.DefaultRequestHeaders.Add("X-Amzn-Accept-Type",
                                "[email protected]");
    
     //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: [email protected]
      X-Amzn-Accept-Type: [email protected]
      Content-Type: application/json; charset=utf-8
      Content-Length: 98
     }}       System.Net.Http.HttpRequestMessage
    
  • mouhcine
    mouhcine over 10 years
    yes, it's already done, I correct it. but I have the same error response.
  • cgotberg
    cgotberg over 10 years
    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.