【发布时间】:2018-12-20 16:13:01
【问题描述】:
我有点不确定如何在 C# 中执行我的发布请求。我曾尝试在 Postman 中这样做,并且它在那里工作没有问题。我认为我的问题是 json 格式。我在 Newtonsoft 库中使用 JObjects 构建我的 json。当下面的代码运行时,这是输出; {"accountreference":"XX","messages":"[{\r\n \"to\": \"+XXXXX\",\r\n \"body\": \"XXXXXXXX\"\r\n}]"} 它是有效的,但正如您所见,它包含换行符和转义字符。将其发布到我正在使用的 api 后,我总是会收到 400 错误请求。
我尝试了各种序列化程序和技术,但无法使其正常工作。我还确保授权标头是正确的,如果它不正确,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 在 Postman 中工作:
{
"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。
【问题讨论】:
-
那是您的确切
to和body吗?没有像@这样的字符?我猜XXXXX只是占位符数据? -
为什么不直接创建一个类来表示您要发布的数据,然后通过
JsonConvert.SerializeObject对其进行序列化? -
@Liam 不,没有多余的字符。 X 只是占位符。我会尝试额外的课程。
-
坚持你的双重编码,
"[{\r\n \"to\": \"+XXXXX\",\r\n \"body\": \"XXXXXXXX\"\r\n}]"是一个刺,而不是 json,注意开头和结尾的" -
这一行
"[" + tmpObj + "]"创建了一个 string ,其中包含您的 json。然后你 json 编码(再次)这就是问题所在。可能最好按照已建议的方式构建对象以解决此问题。