【问题标题】:How do I read multiple parameters from a JSON request body in ASP.NET Core?如何从 ASP.NET Core 中的 JSON 请求正文中读取多个参数?
【发布时间】:2020-07-23 16:12:08
【问题描述】:

基本上,我有一个这样的 API 端点:

public async Task<ActionResult<UserDTO>> SignUp(string username, string password, Guid inviteId)

我希望所有这些参数都来自请求正文中的 JSON 对象,如下所示:

{
    'username': 'foo',
    'password': 'bar',
    'inviteId': '00000000-0000-0000-0000-000000000000'
}

我知道我可以创建一个将这些参数作为字段的类,但是有没有更简洁的方法来做到这一点?另外,我如何接受来自 JSON 对象另一个来源的参数? (即inviteId 可能来自 JSON 对象或查询字符串)

编辑:澄清一下,我不想使用自定义类,类似于 JObject。我希望该函数直接接收其参数,而无需进行任何手动解包或解析。基本上,函数签名应该保持为SignUp(string username, string password, Guid inviteId),并且解决方案应该添加到 ASP.NET 的模型绑定功能。另外,如果可以的话,我不想使用任何第三方包。

【问题讨论】:

  • 我喜欢使用 Json.NET 库和 dynamic 关键字。这样的事情可能会奏效。 dynamic data = JObject.Parse(stringContent); 这将使您可以在运行时访问data.inviteId

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


【解决方案1】:

有几种选择。我会使用模型绑定来完成这个:

[HttpGet] // Or any HTTP method
public IActionResult GetSomething([FromRoute] string username, [FromQuery] SomeQuery query) 

Reference

【讨论】:

  • 是的,这就是我所拥有的。但是,我不想从路由、查询字符串等接收参数,而是希望接收参数作为 JSON 对象
【解决方案2】:

NewtonSoft package 中使用JObject

  1. 导入

    using Newtonsoft.Json.Linq;
    
  2. 改变方法,如,

    public async Task<ActionResult<UserDTO>> SignUp([FromBody] JObject dataObject)
    
  3. 您可以通过按键访问数据,

    var username = dataObject["username"].ToString();
    var password= dataObject["password"].ToString();
    

使用这种机制,您可以在没有模型绑定的情况下处理复杂的 JSON 对象。

【讨论】:

  • 我不想在函数内部手动进行任何解包 (dataObject["username"]) 或解析 (.ToString())。这一切都应该由某种中间件来处理,比如输入格式化程序。另外,如果可以的话,我不想使用任何第三方软件包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 2021-04-09
  • 1970-01-01
相关资源
最近更新 更多