为什么复杂字符串(字符串化json数据)不被接受为Web API方法的POST参数,而简单字符串被接受

本文关键字:字符串 方法 API POST 参数 简单 Web 数据 json 复杂 为什么 | 更新日期: 2023-09-27 18:29:17

我想将一组转换为json的数据作为字符串发送到Web API POST方法。我可以发送一个简单的字符串,但当我尝试发送字符串化的json数据时,甚至无法到达该方法——显然复杂的字符串没有被视为有效的字符串值或其他什么。

这在从客户端传递"randomString"时有效:

Web 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数据,以便接收和识别它?

为什么复杂字符串(字符串化json数据)不被接受为Web API方法的POST参数,而简单字符串被接受

您遇到了麻烦,因为您正在通过URL将JSON发送到API。我建议您将其发送到您请求的正文内容中。为了做到这一点,改变你的WebApi方法如下:

[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客户端库的链接,以查看有关在需要时向API发送数据的更多示例。