【问题标题】: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 参数,而简单字符串却可以?
【发布时间】:2016-01-06 18:09:42
【问题描述】:

我想将一堆转换为 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 数据以便接收和识别?

【问题讨论】:

    标签: c# serialization json.net http-post asp.net-web-api-routing


    【解决方案1】:

    您遇到了麻烦,因为您通过 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 发送数据的示例。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2015-11-29
    • 2016-07-18
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多