【问题标题】:Posting single and collection of objects to the same endpoint in ASP.NET Core API?将单个对象和对象集合发布到 ASP.NET Core API 中的同一端点?
【发布时间】:2018-08-29 12:57:15
【问题描述】:

我正在寻找一种方法让相同的端点(在 ASP.NET Core 2.0 中)接受单个和一个集合,但不知道如何使其工作:

    [HttpPost]
    [Route("")]
    public ActionResult<string> Post([FromBody] SampleModel model)
    {
        return "Single";
    }

    [HttpPost]
    [Route("")]
    public ActionResult<string> Post([FromBody] SampleModel[] models)
    {
        return "Multiple";
    }

目标是使两者都可以发布

{
  "name": "Single"
}

还有

[
  {
    "name": "Multi1"
  },
  {
    "name": "Multi2"
  }
]

到同一个端点 - “api/sample/”。

这是否可能(通过使用自定义模型绑定器等)?

这似乎是 API 支持的一件好事。

【问题讨论】:

  • 尝试查找 JObject 现在的挑战是识别对象或集合,因此在这种情况下,如果您对对象的覆盖成功,那么它就是平均对象,否则就是集合。
  • @Parwej 是的,我认为这是一个解决方案,但是你失去了所有模型构建的优点。

标签: c# asp.net routing


【解决方案1】:

您可以声明一个从主体中获取 JToken 的单个操作,然后根据您可以将令牌反序列化为的类型调用您想要的方法。

private ActionResult<string> Single(SampleModel model)
{
  return "Single";
}

private ActionResult<string> Multiple(SampleModel[] models)
{
  return "Multiple";
}

private bool TryToObject<T>(JToken token, out T value)
{
  try
  {
    value = token.ToObject<T>();
    return true;
  }
  catch (Exception) { }
  value = default(T);
  return false;
}

[HttpPost]
[Route("")]
public ActionResult<string> Post([FromBody] JToken token)
{
  if (TryToObject(token, out SampleModel[] models))
    return Multiple(models);
  else if (TryToObject(token, out SampleModel model))
    return Single(model);
  else
    return BadRequest();
}

【讨论】:

  • 谢谢! JToken 是问题的关键! :D
猜你喜欢
  • 2015-01-15
  • 2020-12-03
  • 2020-12-05
  • 1970-01-01
  • 2019-03-26
  • 2019-03-20
  • 2017-10-21
  • 1970-01-01
  • 2015-12-28
相关资源
最近更新 更多