首先,命名一踏糊涂,比如某些订单列表数据 A、B、C。
../api/a
{ "code": 200, "msg": "ok", "a_list": { ...list } }
../api/b
{ "code": 200, "msg": "ok", "b_list": { ...list } }
../api/c
{ "code": 200, "msg": "ok", "c_list": { ...list } }
因为这三个 api 接口用的都是相同的页面和布局,就因为这种脑残的 list 命名,前端会为此作出特殊的处理。
再举个例子:不知道某些后端对 json 是不是有什么误会,json 的数组和对象都分不清(在他们眼里,json 的对象和数组都是数组),这不是最恶心的,更恶心的是,同一个 api 接口同一个值,在不同的情况下,给你返回不同的数据类型。比如:
同一个接口:../api/data
某些情况是这样的:
{ "code": 200, "msg": "ok", "data": { ...list } } 某些情况又是这样的: ```json { "code": 200, "msg": "ok", "data": [] } 再举个例子,明明不是数组,但是却要用[]来包一层,比如: 已知这个 data 的数据结构永远不是一个数组的。 ```json { "code": 200, "msg": "ok", "data": [{ ...list }] }
再举个例子,当只有一条数据的时候,是这样的:
{ "code": 200, "msg": "ok", "data": { ...list } }
当没有数据的时候是这样的
{ "code": 200, "msg": "ok", "data": [] }
当有一条以上的时候又是这样的:
{ "code": 200, "msg": "ok", "data": [{ ...list }] }
这些后端不知道是因为懒,还是因为自己的认知有限,每次和这样恶心的接口对接,作为一个前端的人来说,看到这样的接口,就像吃屎一样。和他们沟通不但不认同,还各种推脱说{}就是数组。。。
各位看官,你们觉得这是不是小题大做了?虽然通过各种处理,这些问题都不算啥,但是为何可以通过常识来解决的事,为何不把规则当规则呢?你用 json,就要遵循 json 的规则。而不是这就是 XXX。
各位前端小伙伴们,遇到这样的接口,你是怎么处理的?
1 back0893 2020-02-11 15:42:04 +08:00 ![]() 哦.后端应该是 php 吧.叫 php 处理下,因为 php 里面的数组不会去区分 list 和 array 的差别 |
![]() | 2 symeonchen 2020-02-11 15:51:34 +08:00 ![]() 与同事协商,协商无果找领导, 与领导沟通,沟通无效换工作。 |
![]() | 3 jugelizi 2020-02-11 15:54:17 +08:00 哈哈 又黑我大 phper 确实 php 在序列化 空对象和有数据的不一样 [] 和 {} |
4 saucew 2020-02-11 16:04:18 +08:00 我猜你们的后端是 php |
![]() | 5 learnshare 2020-02-11 16:04:41 +08:00 a_list 直接开除吧,或者你辞职吧 |
6 loopback 2020-02-11 16:18:19 +08:00 碧池配狗,天长地久 |
7 huntcool001 2020-02-11 16:20:21 +08:00 这是你们技术部门管理的问题... |
![]() | 8 imnpc 2020-02-11 16:21:48 +08:00 这个看起来后端是 PHP,确实有些处理方法不太一样,需要沟通下 |
![]() | 9 cmdOptionKana 2020-02-11 16:23:14 +08:00 你们不开会的吗,会议上摊开来当面说个明白。 |
![]() | 10 imdavidyang 2020-02-11 16:25:30 +08:00 不是某些后端,是你们的后端,规范建设不严。 这种事情在对接接口时不沟通好需要打板子,当时不据理力争自己也得挨上 20 板子 |
11 pastgift 2020-02-11 16:27:53 +08:00 via iPhone 和是不是后端没关系,就是水平差,让他写前端搞不定会要求后端一个页面一个接口呢 |
![]() | 12 cpdyj0 2020-02-11 16:30:47 +08:00 后端是不是不熟悉自己用的这个技术栈,感觉是序列化反序列化的锅,肯定不会是 Java 系的 |
13 Cbdy 2020-02-11 16:33:36 +08:00 后端换 Node,JS 一把梭,天下太平 |
![]() | 14 cpdyj0 2020-02-11 16:38:23 +08:00 前后端一起换 Kotlin 吧,后端上 Kotlin/Native Kotlin/JVM 前端上 Kotlin/js (x |
![]() | 15 Alexhohom 2020-02-11 16:39:35 +08:00 最后两个没问题吧,没数据和有数据的 json 就应该是这样 |
16 ben1024 2020-02-11 16:42:44 +08:00 加一个数据输出层过滤解决这种输出类型无约束情况 |
17 ccraohng 2020-02-11 16:50:20 +08:00 via iPhone 我猜你们后端是 php |
![]() | 18 garlics 2020-02-11 16:53:19 +08:00 最后的只要不是同一个接口,问题就不大吧。a_list 这个就是水平问题了。 |
![]() | 20 rioshikelong121 2020-02-11 16:58:16 +08:00 沟通 不行自己加中间层转化。 |
![]() | 22 mcfog 2020-02-11 16:59:20 +08:00 via Android 怎么说呢,你要发帖吐槽这个,至少先搞清楚 markdown 语法,还有你自己的... list 这个 token 的语义 现在这样看上去感觉就是五十步笑百步 |
23 Philippa 2020-02-11 16:59:56 +08:00 via iPhone 提交接口时打回去,或者说用强类型协议,比如 graphql |
24 luozic 2020-02-11 17:00:44 +08:00 规范啊,不规范的 json,公共 prase 库认么? |
25 Juicpt 2020-02-11 17:04:40 +08:00 ![]() |
26 dilu 2020-02-11 17:11:45 +08:00 php 的确会这样 只能说规范一开始就没做好 跟语言无关 跟人有关 一般我都会跟客户端或者前端提前确认结构,怎么互相方便怎么来。 |
27 5bb864e1fc775087 2020-02-11 17:22:32 +08:00 ![]() 接口返回格式已经确定是 code msg data 这 3 种 这两个接口要怎么处理比较好? a 接口: { "code": 200, "msg": "ok", "data": { xxx: true, yyy: 123, zzz: "zzz", } } b 接口: { "code": 200, "msg": "ok", "data": [ 'xxx', 'yyy', 'zzz', ] } |
![]() | 28 sytnishizuiai 2020-02-11 17:29:27 +08:00 我也是 phper,之前做前后分离也碰到过,无论我给的 json 还是接收的 json 格式,我先写 api,如果前端处理不了或者不规范,我这直接统一改,很快的,即使需要改成很奇怪的格式来适应某个功能,我们前端还是外包靠微信交流的。(有时候他方便就他改了) 所以这是开发人员个人问题和交流问题了。 |
29 exploreXin 2020-02-11 17:29:56 +08:00 ![]() 都在说后端谁谁谁怎么怎么样,是有人代码不规范,但这不是造成问题的的主要原因,真正原因是团队代码质量体系没跟上,每次代码写完有代码审查制度吗,没有时间代码审查,团队总该有个代码规范约束大伙吧,没有代码规范,开会的时候临时沟通下总该有吧,要是都没有,那代码质量不高也就不奇怪了。写这种水平不高的代码,有的人是懒,不负责任,而有的人是因为上家公司就是这么写的,现在还是这么写,并且现在的公司也没人把这事提出来当做紧要事情处理一下,一个制度完美的团队,应该是就算是 0 基础 0 规范的开发进到团队里面,也可以通过短时间跟上团队的规章制度,按照规范来工作,只是现实中大多都是创业小公司,能活下来就不错了,根本没有时间与精力去搞那些领导眼里“没用”的事情,要什么规范,能赚钱才是王道,两个后端给的东西都兼容不了,给你那么高工资干啥用的,如果遇到这种领导的公司环境,这个基本无解,秉持要么忍要么滚的原则,反正我遇到这种一般都是自己滚的,钱哪里都可以挣,但是技术水平,技术习惯这种个东西随着年月增长,是不可逆的,失去的时间不可能再追回来了,所以与其在不规范团队混日子拿工资,不如去个规范的团队,工资少拿一点也没什么。 |
30 fxxwor99LVHTing 2020-02-11 17:34:38 +08:00 这很明显后端有问题啊,和技术大佬反馈。 |
31 charlie21 2020-02-11 17:36:38 +08:00 所以接受哪些方面的教育才可以避免此类错误呢? |
![]() | 32 mdesi 2020-02-11 17:50:19 +08:00 找技术领导反馈问题啊 |
![]() | 34 orzorzorzorz 2020-02-11 18:08:31 +08:00 如果只是命名不舒服,可以让公司大佬加个 schema,专门用来对应字段的中文名。 |
![]() | nbsp; 35 mogita 2020-02-11 18:11:33 +08:00 Tech Lead 有最终决定权,而且应该为这类设计负责。让他 /她知道你们的问题先。 |
36 fewok 2020-02-11 18:24:06 +08:00 这种槽吐的,真没深度。 |
37 mengzhuo 2020-02-11 19:59:27 +08:00 一看就是 PHP 的锅哈哈哈 |
![]() | 38 jokeqf 2020-02-11 20:05:19 +08:00 人不行怪语言,真逗。就跟国足踢得不好怪教练一样。 |
![]() | 40 springz 2020-02-11 20:15:11 +08:00 曾经有一段时间,我拿到后端奇怪的 JSON,刚工作,不敢喷,自己默默的在入口写正则处理成正常 JSON。 |
![]() | 41 springz 2020-02-11 20:16:24 +08:00 多年 PHPer,多年 Javaer,说句公道话,大部分 PHP 程序员可能真的是不知道其他语言程序员会骂娘。 |
![]() | 43 springz 2020-02-11 20:21:44 +08:00 技术栈太单一,array 打天下。 |
44 ZXCDFGTYU 2020-02-11 21:09:30 +08:00 跟领导说就是了,没有必要一杆子打死人。我之前也不知道,后来公司的技术总监教给我的,告诉我这么做方便其他语言的同事开发。4 年 phper。 |
![]() | 45 DelayNoMay 2020-02-11 21:18:04 +08:00 你作为前端,我觉得你应该先了解下你对接的后端语言,简单了解即可,就不会有这么大反应了 |
![]() | 46 p1gd0g 2020-02-11 21:58:48 +08:00 项目组一直用 proto,没有遇到过类似的问题。 |
47 iiji86 2020-02-11 22:00:57 +08:00 via iPhone @Juicpt 要是不要求排序感觉也挺好,连接口文档都不需要就能看懂所有字段的意义,还不用费脑子想英文 ze 翻译 |
![]() | 48 wangyzj 2020-02-11 22:12:15 +08:00 这不是语言的问题了 这是没规定好规则的问题 |
![]() | 50 springz 2020-02-11 22:51:14 +08:00 中国这么多城市,你全写实体类试试。 |
51 a852695 2020-02-11 23:02:29 +08:00 基本上每个月都会有这种帖子,我建议还是请你同事一定要认真看看《 HTTP 权威指南》,只需要读前半部分就应该懂 HTTP 协议,这些滥用明显就是对 HTTP 都不懂,拿着半截就开始跑,说的不好听,这种人基础太差了,你和他讲道理是讲不通的,而且你作为前端,一定要强势,因为前端才懂需求,你直接告诉他:不能做就辞职。 |
![]() | 52 815979670 2020-02-12 06:34:33 +08:00 PHP 确实不分这个 但是因为后台的前端部分是我写的 所以 我 json_encode 的时候 会注意这个 |
53 sampeng 2020-02-12 07:49:02 +08:00 via iPhone 这种返回结果你还不怼?心真大 |
54 kim01 2020-02-12 09:27:26 +08:00 别说其他的,高德地图之前的接口都有这个问题。。。。 |
55 Juicpt 2020-02-12 09:27:27 +08:00 |
56 killerv 2020-02-12 09:30:55 +08:00 所以,很多垃圾 PHP 程序员拉低了 PHP 这门语言 |
![]() | 57 xman99 2020-02-12 09:49:52 +08:00 希望你们可以规范起来。 如果是返回单个对象,要求返回单个对象的, 我觉得完全没问题 多个数据返回数组,这样要求没问题。如果奇奇怪怪返回的,请主管协调一下吧 |
![]() | 58 keepeye 2020-02-12 10:27:46 +08:00 该后端可能是北大青鸟出来的? |
![]() | 59 codelegant 2020-02-12 10:59:22 +08:00 不要浪费时间在 v2 上发帖,直接去工位上喷。 |
![]() | 60 KyonLi 2020-02-12 11:17:51 +08:00 via iPhone 习惯了,现在不对接口请求进行封装,写好一个请求到处粘贴再根据实际情况修改,能用就好技术追求不能当饭吃 |
![]() | 61 HanMeiM 2020-02-12 11:20:25 +08:00 所以,很多垃圾 PHP 程序员拉低了 PHP 这门语言 +1 |
![]() | 62 gz911122 2020-02-12 11:41:44 +08:00 我猜你们的后端是 php |
![]() | 63 zakokun 2020-02-12 11:59:08 +08:00 怎么又在骂 php 了...码农经常自称逻辑严谨,结果一个个都这么狭隘的 说白了,这就是你们团队有问题,前端,后端,移动端一个个都不是无辜的,一个都跑不掉。不可能后端一坨屎,前端都是白莲花,就从后端能出这种接口,你们前端包括 leader 既然没开会沟通定规范,前端移动端也好不到哪去啊 |
![]() | 64 xmge 2020-02-12 12:36:14 +08:00 确实,这种格式对前端很不友好。 感觉后端做成这样也得刻意写个方法处理下。 |
![]() | 65 xmge 2020-02-12 12:36:30 +08:00 总结:你和他有矛盾吗? |
![]() | 66 loshine1992 2020-02-12 12:45:08 +08:00 我们后端 PHP 也出了一下子返回 {} 一下子返回 [] 的问题 弄得我头都大了。。 |
67 ljhaoboy 2020-02-12 13:56:45 +08:00 via iPhone 我想到了饿了么的签到,签到没奖励的时候返回的[],有奖励的时候就是 json |
![]() | 68 wangbenjun5 2020-02-12 14:02:24 +08:00 只说一个 PHP 可能会遇到的问题就是一会 {} 一会 [],让 PHP 特殊处理一下把空数组转成 object 就能解决,其它都是规范问题,前后端交互如果没有规范那是很头疼的事情,多点沟通吧! |
![]() | 70 veike 2020-02-12 17:47:00 +08:00 路由就不说了,自己的问题,和 php 没关系。 返回的数据问题: 当只返回一条数据的时候: data:[] 就变成了 data:{},这里返回的是该条数据。例如:后端是:["ok" => 1],前端:{"ok":1},如果为空,就是[]。如果放在数组里,就是[{}],前端返回和后端一样。 当返回多条数据,data 就是 data:[{},{}],在后端就是: [ ["foo1" => "bar1"], ["foo2" => "bar2"] ], 到了前端就是: [ { "foo1" => "bar1" }, ... ] 然后如果分页的话,一般是,后端 [ "last_page":2, data:[ {}, .... ] ] 这些就是自己处理的,你要和后端说一下。 然后返回的数据要统一处理一下。可以这样, json_encode([],JSON_FORCE_OBJECT | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) 这样在前端返回的都是 object。 |
![]() | 71 hallDrawnel 2020-02-12 18:25:50 +08:00 List 就该是 List,kv 就该是 kv,跟他说不清楚就向上汇报。 |
72 back0893 2020-02-12 19:56:21 +08:00 就是后端的问题 应该是直接拼的返回值 因为 php 里面的 list 和 dict 不区分导致的,叫后端处理下就完事 |
![]() | 73 是人的问题,大家别怪到后端的问题上,也不要怪到 php 的头上了。 如果你们后端不知道怎么做,告诉你们的后端,new \stdClass() 就是一个空对象了,确实是要几行代码的。 |
![]() | 74 melvin 2020-02-12 21:07:53 +08:00 如果我们后端也这样提供,我也得骂他丫的,这种谁顶得住 |
75 yeqiaowei321 2020-02-13 09:00:03 +08:00 @Juicpt 哈哈哈哈,太秀了 |