【问题标题】:ContentType application/json in ASP.NET WebAPIASP.NET WebAPI 中的 ContentType application/json
【发布时间】:2013-05-08 15:14:03
【问题描述】:

我正在使用 ASP.NET MVC 4 WebAPI 构建我的第一个 WebAPI。

请求必须使用 application/json ContentType 以 utf-8 作为字符集发送。

我的 POST 方法如下所示:

    public HttpResponseMessage Post([FromBody]string value)
    {
        return new HttpResponseMessage(HttpStatusCode.OK);
    }

每当我发送 POST 请求时,参数“value”为空。请求正文包含 Json:{ "name":"test" }

我更喜欢将 Post 方法的参数设置为包含 Json 的字符串或 JObject 类型(来自 JSON.NET 库)。我该如何做到这一点?这甚至可能吗?

【问题讨论】:

  • 当然。首先,将值重命名为'name'
  • 那行不通。参数的值仍然为空。 Json 最终将类似于 { "name1": [ {}, {} ], "name2": [], "name3":"some value" }。我不希望系统本身将 Json 反序列化为对象。我想自己做。
  • 如果要控制反序列化,请为 JSON 添加自定义媒体类型格式化程序。否则,您是否可以选择将正文作为 x-www-form-urlencoded 字符串发送,然后从中创建一个对象?
  • 如果你发送一个 JSON 对象到 Web API 服务,你可以创建一个包含“name1”、“name2”等的 POCO 模型,然后你可以将你的方法更改为 public HttpResponseMessage Post(YourObject object) {} 之后,您可以使用通常的 JSON.NET 解析方法在方法中对其进行反序列化。您是从 JavaScript 发送 JSON,可以显示代码吗?
  • 这是一个很好的例子:stackoverflow.com/questions/13870161/…

标签: json asp.net-web-api


【解决方案1】:

最简单的方法是直接从Request.Content获取原始字符串:

public async Task<HttpResponseMessage> Post()
{
    string value = await Request.Content.ReadAsStringAsync();

    return new HttpResponseMessage(HttpStatusCode.OK);
}

有一种方法可以让 ASP.NET Web Api 将您的请求正文视为字符串内容,但为了做到这一点,内容必须采用 =value 格式,在您的情况下是这样的:

={ "name":"test" }

您可以使用以下 jQuery 代码(例如)实现类似的功能:

$.post('api/values', '=' + JSON.stringify({ name: 'test' }));

在这种情况下,您可以使用问题中的签名。

最后总有一个选项可以创建自己的MediaTypeFormatter 来替换默认的JsonMediaTypeFormatter 并使其始终将内容反序列化为JObject。您可以阅读有关创建和注册 MediaTypeFormatter herehere 的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-24
    • 2011-02-20
    • 2014-04-27
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多