【问题标题】:How to implement a C# model class for properties that may occur multiple times (prop, prop2, prop3, ...)?如何为可能多次出现的属性(prop、prop2、prop3、...)实现 C# 模型类?
【发布时间】:2020-02-11 18:30:58
【问题描述】:

我有一个 ASP.NET Core 2.1 API Web 服务。

应该使用可以使用以下请求的新 API 端点扩展 Web 服务(HTTP POST 正文是 www-form-urlencoded):

foo=1&bar=2&baz=3&baz_2=3&baz_2=4

上面的 www-form-urlencoded 以一种更易读的方式:

  • 参数foo,值为1
  • 参数bar,值为2
  • 参数baz,值为3
  • 参数baz_2,值为4

参数foobar 在请求中完全存在且仅存在1 次。参数baz 在请求中至少存在1 次。 baz 参数出现多次是很常见的,但我见过只有一个 baz 参数的情况。

我对发件人没有影响。我可以选择使用上述格式的请求,或者根本无法接收数据。我需要这些数据,这些数据只会以上述方式提供。

我已经为请求中仅存在 1 次的参数建模了一个 C# 模型类:

namespace StackOverflow.WebAPI.Models
{
    public class ConsumeRequest
    {
        public int foo { get; set; }
        public int bar { get; set; }

        public ConsumeRequest()
        {
            foo = 0;
            bar = 0;
        }

        public ConsumeRequest(int foo, int bar)
        {
            this.foo = foo;
            this.bar = bar;
        }
    }
}

模型应作为Action参数,如:

namespace StackOverflow.WebAPI
{
    public class EndpointController : BaseController
    {
        [HttpPost]
        public JsonResult Consume([FromBody] ConsumeRequest data)
        {
            // Do something with data.
            return new JsonResult("ok");
        }
    }
}

理想情况下,baz 将是 List<int>List 的顺序将代表bazs 的“顺序”(bazbaz_2baz_3,...)。

如何扩展模型实现以使用 baz 参数?

【问题讨论】:

  • 你试过什么?这似乎是一项家庭作业。
  • 我可以尝试什么?文档指出,当参数多次出现时(完全相同的参数名称没有前缀/后缀),则有可能将其实现为数组。我没有找到有关此前缀/后缀内容的信息。而且实现数百个baz_N 属性是不切实际的。可能缺少实例,因为我直到 N 才实施,但那里有 baz_(N+1)

标签: c# asp.net-core .net-core model


【解决方案1】:

这不是您希望绑定的有效请求格式。 baz_2 键字面意思是类似于Baz_2 属性,而不是Baz 集合中的第二项。为此,密钥必须类似于baz[],根据需要重复多次。例如:

?baz[]=3&baz[]=4

这将创建一个值集合[3, 4]

如果问题是您无法控制查询字符串的格式,那是 客户端 问题,而不是您的问题。 API 实际上是一个接口。它强制执行请求的特定形式和功能,不符合该接口是一个错误的请求。你永远不应该改变你的 API 来适应客户端;而是客户端需要更改其代码以符合您的 API。

也就是说,如果您在这里别无选择,您唯一能做的就是添加Baz_2 属性和Baz_3Baz_4 等,根据需要添加。但是,总会有一些限制,因为这些必须是文字属性,您必须实际添加到您要绑定的类中。

【讨论】:

  • 感谢您的澄清。我也是这么想的,但希望有办法。我想我必须手动解析数据。但我敢打赌,这总有一天会咬我
  • 我建议按照应有的方式设计 API,然后为此专门添加一个端点,将请求转换为适当的格式。您甚至可以放弃实际的绑定过程,直接使用查询字符串来为自己提供更大的灵活性。然后,行为适当的客户端可以到达良好的端点,您只需要维护翻译层。
猜你喜欢
  • 2016-07-27
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 2020-05-23
  • 2023-03-29
  • 2014-03-16
相关资源
最近更新 更多