【问题标题】:ASP.Net Web Api, POST multiple objectsASP.Net Web Api,POST 多个对象
【发布时间】:2017-10-07 13:08:10
【问题描述】:

我有这个 AngularJS Http 调用

$http({
       method: "POST",
       url: Helper.ApiUrl() + '/Api/Case/SendCase',
       data: { obecttype1, obj2, obj3},
                }).then(function mySuccess(response) {});

Ant 这个 ASP.net Web Api 方法

[HttpPost]
[Route("Api/Path/SendCase")]
 public int SendCase(object application)
 {

 string applicantName = ((Newtonsoft.Json.Linq.JObject)application)["applicant"].ToString();

 obecttype1 obj = JsonConvert.DeserializeObject<obecttype1>(((Newtonsoft.Json.Linq.JObject)application)["obecttype1"].ToString());

   .........................
   return ID;
  }

这很好用,但我觉得它有点,因为我在我的方法中解析我的对象,所以我的问题是

是在 POST 方法中将多个对象作为参数发送的方法吗,我宁愿避免修改我的模型,避免为此创建一个类

所以我的 Api 方法看起来像这样

 public int SendCase(class1 obecttype1, class2 obj2, class3 obj3)

【问题讨论】:

  • 如果不创建一个新类来保存objecttype1obj2obj3,您将无法做到这一点。

标签: angularjs asp.net-mvc asp.net-web-api


【解决方案1】:

“是在 POST 方法中将多个对象作为参数发送的方法吗,我宁愿避免修改我的模型,避免为此创建一个类”

按照设计,HTTP Post 只能有一个正文,Web api 将尝试将正文转换为方法签名中定义的参数。因此,在正文中发送多个对象并尝试将这些对象与方法签名中的多个参数进行匹配是行不通的。为此,您需要定义一个包含其他类并匹配主体签名的类。

public class postDTO
{
    public class1 class1Data { get; set; }
    public class2 class2Data { get; set; }
    public class3 class3Data { get; set; }
}

//The api signature
public int SendCase(postDTO application)

如果你仍然不想添加新类,那么我会直接使用 JObject 作为参数,就像这样

[HttpPost]
public int SendCase(JObject jsonData)
{
    dynamic json = jsonData;
    JObject class1DataJson = json.class1Data;
    JObject class2DataJson = json.class2Data;
    JObject class3DataJson = json.class3Data;

    var class1Data = class1DataJson.ToObject<class1>();
    var class2Data = class2DataJson.ToObject<class2>();
    var class3Data = class3DataJson.ToObject<class3>();
}

【讨论】:

  • HTTP Post 只能有一个正文,但是当您使用 Angular Http 服务或 jQuery Ajax(对象必须是键值对)发布多个对象时,它们会被序列化为 JSON 字符串 (如果您不指定内容类型,则默认情况下)。然后,当 JSON 字符串传输到服务器时,ASP.NET Web API 将尽力使用模型绑定和媒体类型格式化程序从消息正文中读取值。因此,没有必要将多个对象放入 1 个对象中。其实我用 { key1: value1, key2, value2 } 指定对象的方式其实是一个单一的对象,匿名对象。
  • 这只是对我的回答的确认,但我认为它是正确的
【解决方案2】:

1.为参数定义模型

public class ClassType1
{
    public int Num1 { get; set; }
    public string Str1 { get; set; }
}

public class ClassType2
{
    public double Test2 { get; set; }
}

2。使用模型作为 API 控制器方法的参数

// Sorry this example is setup on .Net Core 2.0 but I think the previous
// versions of Web Api would have similar/same behavior

[Route("api/[controller]")]
public class ValuesController : Controller
{
    [HttpPost]
    public void Post(ClassType1 ct1, ClassType2 ct2)
    {}
}

3。发布时,数据 {} 中的对象必须具有与您在 Controller 方法中定义的参数名称匹配的键

jQuery ajax

        $.ajax({
                method: 'post',
                url: 'http://localhost:53101/api/values',
                dataType: 'json',
                data: {
                    // It takes key value pairs
                    ct1: {
                        num1: 1,
                        str1: 'some random string'
                    },
                    ct2: {
                        test2: 0.34
                    }
                }
            });

总而言之,是的,您可以将多个对象发回服务器,只要

  1. 您为每个对象定义一个键,并且该键必须与您在服务器方法上定义的参数名称相匹配。
  2. 对象结构必须匹配。

-- 更新--

作为证明,这里是截图:

【讨论】:

  • 它对我有用。我创建了示例并在发布之前先对其进行了测试。我只是不知道这是否是你从一开始就想要的。既然你已经设置了你的环境,即 Web API 和 Angular,你为什么不试试它并告诉我它是否工作。
  • 我搬到aspnet core +1的时候会试试
  • 我认为 ASP.NET Web Api 的工作方式相同。有机会就试试吧。
【解决方案3】:

我们有一个使用 DefaultHttpBatchHandler 接受多部分 POST 请求的应用程序。由于许多原因,我认为它有点笨拙,但它是在一个请求中以结构化方式接受多个对象的内置方式。

https://msdn.microsoft.com/en-us/library/system.web.http.batch.defaulthttpbatchhandler(v=vs.118).aspx

至于创建东西的脚本,我不知道。我们使用此 API 的调用者是 C# 服务,可以使用我们提供的简单客户端库来创建多部分请求,以帮助他们做到这一点。

【讨论】:

  • 我会试试的,听起来很有趣
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-07
  • 2017-12-09
  • 2013-02-23
  • 1970-01-01
相关资源
最近更新 更多