为啥 Web API 可以正确解析动作路径中逗号分隔的 int 数组,但无法解析逗号分隔的十进制数组?

Posted

技术标签:

【中文标题】为啥 Web API 可以正确解析动作路径中逗号分隔的 int 数组,但无法解析逗号分隔的十进制数组?【英文标题】:Why does Web API parse a comma-separated int array in an action path correctly but cannot parse a comma-separated decimal array?为什么 Web API 可以正确解析动作路径中逗号分隔的 int 数组,但无法解析逗号分隔的十进制数组? 【发布时间】:2021-11-19 14:00:21 【问题描述】:

我有一个用 .NET Core 2.1 编写的 Web API 项目。我正在尝试创建一个可以将十进制值数组作为参数的操作。

如果我将参数数据类型定义为string[]int[],那么当我调用操作时,传入逗号分隔的字符串,Web API 能够将其解析为字符串数组或整数数组.

但是,如果我将参数的数据类型更改为 decimal[] 并使用相同的逗号分隔字符串再次调用它,Web API 会去掉逗号并将值连接在一起以形成一个大的小数。

如果参数定义为int[],为什么它会正确拆分逗号分隔的字符串,但如果它是decimal[],则不会?

例子:

这是我的行动:

[HttpGet("details/shipmentDetailIds")]
public async Task<List<ShipmentDetail>> GetByShipmentDetailIds(decimal[] shipmentDetailIds)

    ...

当我通过 Postman 调用它时,这是作为参数传入的:

当我将参数定义为十进制数组时,下面是在操作中解析数组的方式:

您可以看到它有效地去除了逗号并将三个数字连接在一起成为一个大的十进制值。

但是如果我将参数的数据类型更改为int[] 并使用相同的参数值从 Postman 再次调用它,这一次 Web API 会正确解析参数,将其拆分为三个数字:

为什么将相同的参数解析为十进制数组和整数数组时会出现不同的行为?我怎样才能让它正确解析逗号分隔的小数?

编辑:我知道我可以通过在查询字符串中传递数组来使其工作。但是,我正在更新一个现有应用程序,其中所有参数都在 URL 路径中传递,而不是查询字符串,所以我想继续使用相同的约定。另一种选择是使用整数数组,因为它有效。然而,虽然 shippingDetailIds 目前看起来是整数,但仓库管理系统中的数据类型是十进制。我宁愿坚持使用正确的数据类型,以防将来开始使用十进制样式的 shippingDetailIds 发货。

【问题讨论】:

这当然看起来很奇怪。如果您包含一个小数位(“3215669.0,3215670.0,3215994.0”),它会做什么? 这就是您应该使用 Postman 发送数组的方式吗?我以为你应该有多个条目。所以这里有多个shipmentDetails 行,每行都有自己的值。 我知道你在新西兰。 (我认出了您签名上的图片,并检查了您的个人资料。)我敢肯定,您会想到这一点,但这可能与您盒子上的文化设置以及从字符串到数字的默认解析行为有关吗?我想知道它是否将逗号视为在美国我们所说的“小数点”。 (我不知道新西兰的数字表示约定,但我可能会想到。) @AnnL.:我尝试了您的建议,即在逗号分隔的输入字符串中的每个数字后添加一个小数位:3215669.0,3215670.0,3215994.0。 Web API 根本不解析它。它不会抛出错误,而是将输入视为一个空的十进制数组。 【参考方案1】:

我将逗号分隔的数字字符串作为整数数组进行了测试,但它给出了错误。十进制数组接受字符串作为一个大数字,但前提是 3 位数字用逗号分隔。

所以我建议你使用目前已知的唯一方法,如果你想发送一个数字数组作为 GET url 的查询参数,它可以工作。

改变动作

[HttpGet("details")]
public async Task<List<ShipmentDetail>> GetByShipmentDetailIds([FromQuery] decimal[] shipmentDetailIds)

    ...

要使用邮递员 GET 使用此查询字符串

...Details?shipmentDetailIds=1232&shipmentDetailIds=2335..and so on

如果您仍然想使用逗号分隔的包含数字的字符串,则将动作输入参数设置为字符串类型,并在动作内部使用拆分将字符串转换为数组。

【讨论】:

最后我按照 Serge 的建议,排序,将参数设置为字符串数组,然后将字符串数组转换为动作内部的十进制数组。

以上是关于为啥 Web API 可以正确解析动作路径中逗号分隔的 int 数组,但无法解析逗号分隔的十进制数组?的主要内容,如果未能解决你的问题,请参考以下文章

解析centos中Apache、php、mysql 默认安装路径

为啥用字符串代替不了路径

将多个用逗号分隔的整数分配给 C 中的 int - 为啥会这样?做啥的? [复制]

web项目部署成功,端口号,路径都正确,项目从来没有从命名,但是访问的时候报错404.求解,到底是为啥。

为啥在 printf() 调用中会遗漏逗号?

详细解说Tomcat 设置虚拟路径的几种方法及为啥设置虚拟路径