[英]send post Https request with Content Type application Json on C#
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?作为响应,我得到 StatusCode:400,ReasonPhrase:'Bad Request',我不知道为什么?
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
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;
}
}
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.基于您说亚马逊希望帖子 json 看起来像这样的事实。
{"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.似乎您应该将 var 内容而不是 var 数据传递给帖子。 Ie IE
var result = client.PostAsJsonAsync<Dictionary<string, Object>>(url, content).Result;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.