【问题标题】:Enabling ASP.NET Web Api to accommodate both JSON and Form encoded data启用 ASP.NET Web Api 以适应 JSON 和 Form 编码数据
【发布时间】:2015-12-14 10:16:29
【问题描述】:

我的 MVC 应用程序中内置了一个 ASP.NET Web api,它当前接收请求随附的所有数据作为表单编码数据。

我将其作为 FormDataCollection 对象接收并像这样解析:

public string Post(FormDataCollection data)
{
    var first = data.Get("FirstName");
    //for every supported field.
}

我的响应始终是 JSON 字符串。

这很好,我想继续适应这一点,但是我希望我的用户能够发送带有内容类型标头应用程序/JSON 以及的 JSON,以便我可以支持两个都。

我如何以简单的方式兼顾两者?是否必须涉及检查内容标题并在每种情况下使用不同的代码来提取属性?

【问题讨论】:

  • 使用模型不合适吗?即public string Post(TargetModel)... 框架应该将它接收到的数据(表单提交或 JSON)解析到您的目标模型中。
  • 我对构建 API 非常陌生,我将如何实现它?如果数据不完全满足模型,我会遇到解析错误吗?
  • 我会写一个快速的答案。

标签: c# asp.net json asp.net-mvc asp.net-web-api


【解决方案1】:

asp.net model binder 为您处理绑定。定义一个代表您的模型的类:

public class Person
{
  public string Firsname{ get; set; }
}

然后让您的控制器操作将此视图模型作为参数:

public class PersonController : ApiController
{

  public void Post(Person model)
  {
    ...
  }
}

最后,您可以使用 jquery ajax 或您选择的任何内容进行发布。例如

$.ajax({
type: 'POST',
url: '/api/person',
cache: false,
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({ Firstname: "John Doe" }),
success: function() {
    ...    
   }
});

【讨论】:

  • 这会处理像 Enumerable 这样的复杂类型吗?
  • @JonnyKnottsvill 是的。
【解决方案2】:

尝试使用如下模型类;

public class MyTargetModel
{
    public string FirstName { get; set; }
}

public string Post(MyTargetModel model)
{
    var first = model.FirstName;
    //for every supported field.
}

当我说模型类时,我的意思是 POCO 类。 ASP.NET MVC 和 Web API 应该能够根据需要将请求数据解析到类中。

【讨论】:

  • 感谢您的回答。所以无论内容类型如何,这都会自动解析?例如,如果模型包含 Id、FirstName、LastName、Mobile 会怎样。并且只传递了 FirstName 和 LastName 并且不需要 Mobile?它会正确解析,而 Mobile 只会为空?
  • 这会处理像 Enumerable 这样的复杂类型吗?
  • 对于引用类型,如果没有传递任何内容,您将获得null,对于值类型,我相信您将获得默认值(int 为 0)。您可以使用DataAnnotations 提供有关您的数据要求的更多详细信息。
  • 是的,它也可以处理序列。
猜你喜欢
  • 1970-01-01
  • 2014-05-19
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 2014-02-22
  • 2016-09-22
  • 1970-01-01
相关资源
最近更新 更多