【问题标题】:send post Https request with Content Type application Json on C#在 C# 上使用 Content Type 应用程序 Json 发送 post Https 请求
【发布时间】:2013-08-06 13:18:47
【问题描述】:

我正在尝试发送以下请求:

 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
 }

为了得到这样的响应格式:

 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)}

为此,我尝试使用此代码:

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;
}

作为响应,我得到 StatusCode:400,ReasonPhrase:'Bad Request',我不知道为什么?

关于我得到的结果的详细信息:

  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

【问题讨论】:

    标签: c# asp.net httpclient json.net amazon-device-messaging


    【解决方案1】:

    我找到了另一个完美的解决方案。

    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;
            }
    
        }
    

    【讨论】:

      【解决方案2】:

      这么快看好像这行代码错了。

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

      基于您说亚马逊希望帖子 json 看起来像这样的事实。

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

      您似乎应该将 var 内容而不是 var 数据传递给帖子。即

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

      【讨论】:

      • 是的,已经完成了,我更正了。但我有相同的错误响应。
      • 我在您的代码中没有发现任何明显错误。您可能想要下载并运行像 fiddler 这样的代理,并将其设置为使用 https 并查看实际通过网络发送的内容。也许标题发生了一些奇怪的事情,但是如果不能真正查看发送和返回的内容,就很难说。通常一个错误的请求是因为 json 帖子有问题。
      猜你喜欢
      • 1970-01-01
      • 2012-01-30
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 2013-10-10
      • 2019-06-26
      • 1970-01-01
      相关资源
      最近更新 更多