为什么复杂字符串(字符串化 json 数据)不被接受为 Web API 方法的 POST 参数,而简单字符串却可以?
Why is a complex string (stringified json data) not accepted as a POST parameter to a Web API method, but a simple string is?
我想发送一堆数据,转换为 json,作为字符串,发送到 Web API POST 方法。我可以发送一个简单的字符串就好了,但是当我尝试发送字符串化的 json 数据时,甚至没有达到该方法 - 显然复杂的字符串不被视为有效的字符串值或其他东西。
这有效,当从客户端传递 "randomString" 时:
网页API
[Route("{unit}/{begindate}/{enddate}/{stringifiedjsondata}")]
[HttpPost]
public void Post(string unit, string begindate, string enddate, string stringifiedjsondata)
{
// test
string jsonizedData = stringifiedjsondata;
WinForms
string dataAsJson = "randomString";
String uriToCall = String.Format("/api/produceusage/{0}/{1}/{2}/{3}", _unit, beginRange, endRange, dataAsJson);
HttpResponseMessage response = await client.PostAsync(uriToCall, null);
当字符串是json数据时,比如这样:
[
{
"ItemDescription": "DUCKBILLS, GRAMPS-EIER 70CT 42#",
"PackagesMonth1": 1467, . . . }]
...它不起作用。我通过使用 JSON.NET 将通用列表转换为 json 来创建此字符串,如下所示:
string dataAsJson = JsonConvert.SerializeObject(_rawAndCalcdDataAmalgamatedList, Formatting.Indented);
String uriToCall = String.Format("/api/produceusage/{0}/{1}/{2}/{3}", _unit, beginRange, endRange, dataAsJson);
HttpResponseMessage response = await client.PostAsync(uriToCall, null);
所以唯一的区别在于字符串;当它像 "randomString" 这样简单的东西时,我在 Web API POST 方法中找到了这一行:
string jsonizedData = stringifiedjsondata;
...但是当它是一个复杂的字符串时,比如字符串化的json数据,那一行就达不到了。
为什么?以及如何修复字符串化的 json 数据以便接收和识别它?
您遇到问题是因为您正在通过 URL 将 JSON 发送到您的 API。我建议您在请求的正文内容中发送它。为此,请像这样更改 Web Api 方法:
[Route("{unit}/{begindate}/{enddate}")]
[HttpPost]
public void Post(string unit, string begindate, string enddate, [FromBody] string stringifiedjsondata)
{
// test
string jsonizedData = stringifiedjsondata;
}
同时更改您的 Winforms 客户端代码:
string dataAsJson = "[{\"ItemDescription\": \"DUCKBILLS, GRAMPS-EIER 70CT 42#\",\"PackagesMonth1\": 1467}]";
String uriToCall = String.Format("/api/produceusage/{0}/{1}/{2}", _unit, beginRange, endRange);
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("", dataAsJson)
});
HttpResponseMessage response = await client.PostAsync(uriToCall, content);
现在它应该可以按预期工作了。如果需要,请查看有关 HTTP 客户端库的 link 以查看有关将数据发送到 API 的更多示例。
我想发送一堆数据,转换为 json,作为字符串,发送到 Web API POST 方法。我可以发送一个简单的字符串就好了,但是当我尝试发送字符串化的 json 数据时,甚至没有达到该方法 - 显然复杂的字符串不被视为有效的字符串值或其他东西。
这有效,当从客户端传递 "randomString" 时:
网页API
[Route("{unit}/{begindate}/{enddate}/{stringifiedjsondata}")]
[HttpPost]
public void Post(string unit, string begindate, string enddate, string stringifiedjsondata)
{
// test
string jsonizedData = stringifiedjsondata;
WinForms
string dataAsJson = "randomString";
String uriToCall = String.Format("/api/produceusage/{0}/{1}/{2}/{3}", _unit, beginRange, endRange, dataAsJson);
HttpResponseMessage response = await client.PostAsync(uriToCall, null);
当字符串是json数据时,比如这样:
[
{
"ItemDescription": "DUCKBILLS, GRAMPS-EIER 70CT 42#",
"PackagesMonth1": 1467, . . . }]
...它不起作用。我通过使用 JSON.NET 将通用列表转换为 json 来创建此字符串,如下所示:
string dataAsJson = JsonConvert.SerializeObject(_rawAndCalcdDataAmalgamatedList, Formatting.Indented);
String uriToCall = String.Format("/api/produceusage/{0}/{1}/{2}/{3}", _unit, beginRange, endRange, dataAsJson);
HttpResponseMessage response = await client.PostAsync(uriToCall, null);
所以唯一的区别在于字符串;当它像 "randomString" 这样简单的东西时,我在 Web API POST 方法中找到了这一行:
string jsonizedData = stringifiedjsondata;
...但是当它是一个复杂的字符串时,比如字符串化的json数据,那一行就达不到了。
为什么?以及如何修复字符串化的 json 数据以便接收和识别它?
您遇到问题是因为您正在通过 URL 将 JSON 发送到您的 API。我建议您在请求的正文内容中发送它。为此,请像这样更改 Web Api 方法:
[Route("{unit}/{begindate}/{enddate}")]
[HttpPost]
public void Post(string unit, string begindate, string enddate, [FromBody] string stringifiedjsondata)
{
// test
string jsonizedData = stringifiedjsondata;
}
同时更改您的 Winforms 客户端代码:
string dataAsJson = "[{\"ItemDescription\": \"DUCKBILLS, GRAMPS-EIER 70CT 42#\",\"PackagesMonth1\": 1467}]";
String uriToCall = String.Format("/api/produceusage/{0}/{1}/{2}", _unit, beginRange, endRange);
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("", dataAsJson)
});
HttpResponseMessage response = await client.PostAsync(uriToCall, content);
现在它应该可以按预期工作了。如果需要,请查看有关 HTTP 客户端库的 link 以查看有关将数据发送到 API 的更多示例。