请求参数中的数字键

背景

最近在业务中遇到一个坑:接口提供方用数字类型做集合的,而大部分情况中数字类型会被转换成字符串类型,导致请求失败。

Java 类型表述:Map<Integer, List<String>>

转换成 JavaScript 对象如下:

1
2
3
4
{
996: ['福报', '肝就完了'],
965: ['养老', '工作生活平衡']
}

但是通过请求传递后,后端接收到的却是:{ '996': ['福报', '肝就完了'], '965': ['养老', '工作生活平衡'] }

两种语言支持情况

  • JavaScript: 支持,可以用 Number 类型做为 object 中的键。
  • Java:不支持,不能用 Interger 类型作为 Map 中的键。

ps: 这个后端肯定吃了空,手动做了层转化,无语…

三种请求类型支持情况

  • Post (JSON): 不支持,JSON 为了兼容 Java 等语言,会将数字类型解析成字符串类型
  • Post (form): 支持,以表单类型进行传参,Map 项会以 Map[key] 的形式传递,且支持数字类型。
  • Get (URL): 不支持,通过 URL Params 进行传参,后端默认会以字符串类型接收。

解决方案

  1. 让后端改回数字类型的键。别想了,人都找不到。
  2. 以 Post(form) 的形式请求。比较方便,但是只能统一用 Post 方式请求了。许多获取、查询类型的接口不用 Get 看起来很奇怪。
  3. 解析。在中间件中使用参数解析函数,通过深度遍历将所有 Map 的键转换成数字类型。
查看评论