大家都混得好好的,你咋这么突出

14 条回复
276 次浏览

后端出了个接口(GET),文档写着入参是一个 ids,类型是 array[string]

前端按照文档,传入一个数组作为参数:

复制
getList() {
  this.$http({
    url: 'findList',
    params: {
      ids: [123, 124, 125]
    },
    method: 'get'
  }).then((res) => {})
}

请求报 400,原因是 get 请求数组类型的参数,会被 qs 自动处理成这种格式:
http://xxx/xxx?ids[]=123&ids[]=124&ids[]=125

于是我换成字符串入参试一下
http://xxx/xxx?ids=123,124,125
请求成功

我以为是接口文档写错了,就跑去问后端,入参类型要不要改成 String,备注打上“多个 id 用,分割”
后端表示没写错,甩了个 curl,入参是 array[string]可以请求成功,我对比了一下,区别在这:
==报 400==:http://xxx/xxx?ids[]=123&ids[]=124&ids[]=125
==正常==:http://xxx/xxx?ids=123&ids=124&ids=125

如果要按照数组入参,前端需要做特殊处理:

复制
getList() {
  this.$http({
    url: 'findList',
    params: {
      ids: [123, 124, 125]
    },
    method: 'get',
    // 处理 ⬇️
    paramsSerializer: function (params) {
      return Qs.stringify(params, { arrayFormat: 'repeat' })
    }
  }).then((res) => {})
}

前端感觉没必要
问后端文档入参类型能不能改成 String,防止后面时间久了业务忘了,看文档和代码对不上
后端表示要改前端自己改
前端就去改了

过了一会儿后端问前端:“你怎么这么执着”

0

1

2

image

个人感觉这种入参http://xxx/xxx?ids=123&ids=124&ids=125本身就很诡异
前端感觉对线没对好doge_flower
晚点移黑洞

种子用户

地址参数是 stirng 的,不是 json,所以传不过去
传过去了也是 string 类型,还得后端自己转,所以不如逗号分割

种子用户

视角问题
后端用数组接收的,他理所当然认为文档上写数组
前端传 string,就觉得应该写 string,但是他其实后端框架自动将 string 处理成数组了

两个都没问题,其实没必要纠结这个,业务走得通了就行,接口文档谁看呢,没人看的

种子用户
Admin

这个问题以前遇到过,最后还是改为ids=123&ids=124&ids=125,缓存和解析都好一些,虽然这种请求比较少。我在用户信息的接口上也传的是,分割,api 端 split 分割,无他,怎么对接舒服怎么来没考虑太多force_smile。对于后端来说,解析上可以直接用注解获取而不用分割字符。

种子用户

没啥争的,你清晰的表达出了自己的想法就行了,在不大量增加工作量的情况下还是妥协吧 👀
image

种子用户
Guardian

还是这个 http://xxx/xxx?ids=123&ids=124&ids=125 形式比较正规些。

参考:

复制
let url = new URL("https://example.com?foo=1&foo=2&bar=3");
let params = new URLSearchParams(url.search);

// 为 foo 添加第三个参数
params.append("foo", 4);

console.log(params.getAll("foo")); // 输出 ["1", "2", "4"]。
console.log(params.toString()); // 输出 'foo=1&foo=2&bar=3&foo=4'

你这个问题比较考验开发者经验了,都可以,这种复杂的最好给个示例
建议 get delete 最好不要传递复杂的数据类型容易出幺蛾子

盲猜后端用的 JAVA Spring,它用 GET 接收数组就是这样的,因为有 Spring 默认有个 StringToArray 的转换,所以你用逗号拼接的形式去传也是可以的。正常有经验的 JAVA boy 应该都知道这个的,解释一下形成共识就行了,这种一定要辩论证明自己没错的估计是个新手 😂

干久了都是突出一个能跑就行

发表一个评论

R保持