我不确定如何在C#中执行我的帖子请求。我尝试在Postman中进行此操作,并且它在那里毫无问题。我认为我的问题是JSON格式化。我在Newtonsoft Library中使用JONS构建JSON。运行下面的代码时,这是输出;{"accountreference":"XX","messages":"[{rn "to": "+XXXXX",rn "body": "XXXXXXXX"rn}]"}
是有效的,但是如您所见,它包含了线路断开和逃脱字符。将其发布到我使用的API后,我总是会收回400个不好的请求。
我尝试了各种序列化器和技术,但无法使其正常工作。我还确保了验证标头正确,如果API不正确,则在返回消息中应该这样说。根据API的开发人员的说法,只有在身体不正确的情况下才会发生此消息。我已经尝试在邮递员中发布线折扣的字符串,这也可以产生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复制到Postman,并且奏效了。但是,我在vs中的重新计算仍然返回400。
您无需使用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; }
}
管理JSON序列化的最简单方法是使用对象而不是原始字符串或尝试手动构成输出(因为看起来您在这里在这里做)。
由于您已经在使用newtonsoft库,因此很容易做到这一点。
frist的东西是创建一个代表要发送到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.
}
}
我希望这能使您进入正确的道路。
在这里找到我的答案:
Web API
使用HTTPCLIENT发布JsonObject我必须在我的内容中添加一个额外的标题:
var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = client.PostAsync(url, content).Result;
我真的很想知道在字符串constructor中指定它的意义是什么,但是可以。