我不确定如何在C#中执行我的帖子请求。我曾尝试在Postman中进行操作,并且在这里工作没有问题。我认为我的问题是json格式。我在Newtonsoft库中使用JObjects构造了json。运行下面的代码时,这是输出; {"accountreference":"XX","messages":"[{\r\n \"to\": \"+XXXXX\",\r\n \"body\": \"XXXXXXXX\"\r\n}]"}
是有效的,但是如您所见,它包含换行符和转义符。将其发布到我正在使用的api上后,我总是会收到一个400错误的请求。
我尝试了各种序列化器和技术,但无法使其正常工作。我还确保Authroization标头正确,如果不正确,API应该在其返回消息中这样说。根据API的开发人员,此消息仅应在正文不正确的情况下发生。我曾尝试在Postman中用换行符发布字符串,但也能产生400。有没有简便的方法可以摆脱它们?
var tmpObj = new JObject {{"to", to}, {"body", message}};
var jsonObj = new JObject
{
{"accountreference", MessageConfiguration.Ref}, {"messages", "[" + tmpObj + "]"}
};
var json = jsonObj.ToString(Formatting.None);
var httpContent = new StringContent(json, Encoding.UTF8, "application/json");
var url = new Uri("www.xxxxxxxx/hjdhsf");
return await PostAsync(url, httpContent);
protected async Task<HttpResponseMessage> PostAsync(Uri endpoint, HttpContent content)
{
using (var httpClient = NewHttpClient())
{
var result = await httpClient.PostAsync(endpoint, content);
return result; //Statuscode is 400 here.
}
}
此有效json在邮递员中有效:
{
"accountreference":"XXXXX",
"messages":[{
"to":"XXXXX",
"body":"XXX!"
}]
}
更新:
根据回答,我尝试了这个:
var body = new
{
accountreference = MessageConfiguration.Ref,
messages = new[]
{
new
{
to = to,
body = message
}
}
};
var json = new JavaScriptSerializer().Serialize(body);
现在json看起来正确了,我什至可以将其从VS复制到邮递员中,并且可以正常工作。 但是我在VS中的要求仍然返回400。
答案 0 :(得分:2)
您不需要使用JObject构建JSON。您可以使用匿名类,也可以使用Paste JSON as Classes
粘贴JSON示例。根据您的JSON样本,一个匿名对象看起来像这样。
var body = new
{
accountrefrence = "XXXXX",
messages = new[]
{
new
{
to = "XXXX",
body = "XXX!"
}
}
}
实际的类可能看起来像这样:
public class Rootobject
{
public string accountreference { get; set; }
public Message[] messages { get; set; }
}
public class Message
{
public string to { get; set; }
public string body { get; set; }
}
答案 1 :(得分:0)
管理JSON序列化的最简单方法是使用对象而不是原始字符串,或者尝试手动组合输出(就像您在此处所做的那样)。
由于您已经在使用Newtonsoft库,因此它非常容易实现。
第一件事就是创建一个对象,该对象代表您想要发送到api的数据。如此处另一个答案所述,您可以简单地通过复制示例JSON来完成此操作,然后在VS中执行“将JSON作为类粘贴”。
最有可能的结果类是:
public class Rootobject
{
public string accountreference { get; set; }
public Message[] messages { get; set; }
}
public class Message
{
public string to { get; set; }
public string body { get; set; }
}
您现在可以做的是获取数据并填充此对象的属性的方法。由于您没有提供有关正在执行的操作的详细信息,因此我仅假设您可以使用某种方法以某种方式接收字符串值。
public void ComposeAndSendJson(string accountReference, string toAddress, string messageBody)
{
RootObject whatIwanttoSend = new RootObject();
Message messageComposed = new Message();
messageComposed.to = toAddress;
messageComposed.body = messageBody;
whatIwanttoSend.accountReference = accountReference;
//I'm doing a pretty bad aproach but it's just to ilustrate the concept
whatIwanttoSend.messages.toList().Add(messageComposed);
var jsonData = JsonConvert.SerializeObject(whatIwanttoSend);
//As you're working on async, you may need to do some working on here. In this sample i'm just calling it in Sync.
var ApiResponse = PostAsync("YOURENDPOINT",jsonData).Result();
//Do something else with the response ...
}
protected async Task<Task<HttpResponseMessage> PostAsync(Uri endpoint, object payload)
{
using (var httpClient = NewHttpClient())
{
//You have to tell the API you're sending JSON data
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//Execute your call
var result = await httpClient.PostAsJsonAsync(endpoint, payload);
//Basic control to check all went good.
if (result.IsSuccessStatusCode)
{
return result;
}
//Do some management in case of unexpected response status here...
return result; //Statuscode is 400 here.
}
}
我希望这会让您走上正确的道路。
答案 2 :(得分:0)
在这里找到我的答案
POSTing JsonObject With HttpClient From Web API
我必须在内容中添加一个附加标头,如下所示:
var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = client.PostAsync(url, content).Result;
我真的很想知道在StringContent构造函数中指定它的目的是什么,