发现客户端同学和前端的对于接口风格的偏好还是有些不一致的

2021-12-17 11:18:00 +08:00
 zoharSoul

比如 users/{user}/repos 这样的 path param, 对于 android 来说, 因为 retrofit 支持, 写起了体验很好, 所以 android 同事还是很喜欢的. 但是前端同事一般都比较抵触.

再比如只有一两个参数的 post 请求, 用 application/x-www-form-urlencoded ,客户端同事一般没啥意见. 但是前端一般会问能不能用 application/json 的.

还是挺有意思的. 哈哈

6828 次点击
所在节点    程序员
74 条回复
preach
2021-12-17 16:34:55 +08:00
只要能用拦截器统一处理的都合理,取决于谁好说话
br_wang
2021-12-17 18:24:29 +08:00
post 请求搞 application/x-www-form-urlencoded 格式,涉及较复杂数据结构(对象、数组嵌套这种),我还真没遇到几个后端同学(语言是 python 、go )能正确取值处理,折腾半天都是后端同学先放弃,为了不耽误时间,还是 application/json 省时省力。
zoharSoul
2021-12-17 18:30:30 +08:00
@br_wang #42

不是说 application/x-www-form-urlencoded 和 application/json 谁好谁坏.

仅仅是分享下工作中发现的趣事,
即客户端同事更喜欢二者看场景来混合使用, 前端同事更喜欢无脑 json
zoharSoul
2021-12-17 18:31:04 +08:00
@br_wang #42 比如你刚才提到的复杂场景, 很多 android 同学在这个时候就会要求用 json 的
lesismal
2021-12-17 18:34:08 +08:00
妹妹你老公是真不行
Cbdy
2021-12-17 18:42:50 +08:00
作为一个前端,我喜欢无脑用 post ,无脑 post json ,这样就没有沟通成本了,post json 完事儿
Anarchy
2021-12-17 19:07:51 +08:00
Android 用 retrofit 表单这种就直接定义接口的时候就写完了
geniusmary
2021-12-17 20:01:53 +08:00
鹅厂用的 pb 是真难受
kwanzaa
2021-12-17 20:30:52 +08:00
@dapang1221 客户端:好呀
dcsuibian
2021-12-17 21:24:09 +08:00
后端,无脑 json ,除非是文件上传。
看看大厂的公开 api 就知道了,json 更加通用,各种语言的支持也好。
而且 application/x-www-form-urlencoded 只是 http 协议里的吧? json 的应用场景更加广泛。spring-amqp 可以用 json ,数据库可以用 json……现在凡是涉及到跨语言通信的我都考虑 json ,甚至一般序列化也会用 json 。
dcsuibian
2021-12-17 21:31:17 +08:00
不过说起来(之前没怎么用过 application/x-www-form-urlencoded ),像是`@Field("orderSn") String orderSn`这个例子,没有 json 版的方案吗?比如`@JsonField("orderSn") String orderSn`这样的?
z42514
2021-12-17 21:35:14 +08:00
我 android 简单参数的时候,确实不喜欢用 json ,就是感觉建一个类好烦
foam
2021-12-17 22:02:15 +08:00
其实是彼此都想着省事。POST payload 定一种数据协议就好了,这里明显是客户端同学偷懒了,根据代码写起来方便与否来决定用什么数据协议。

“少参数用 form 主要是为了避免创建没有意义的 class”,这类技术麻烦可以用技术手段解决,而不是要求外部改变接口的数据协议。

其实统一就好,不然还要仔细看 API 文档这是什么协议,也不方便维护。除非真的有什么特别的场景,再单独处理。
统一很重要。
DOLLOR
2021-12-17 22:23:25 +08:00
以前的项目,经常各种风格都有,包括 form 、xml 、json,甚至自立规范的 string 编码。
现在明白了,还是 json 最省事,不管是简单的一个 msg:ok ,还是复杂深层嵌套的数组和对象,都能胜任。
iseki
2021-12-17 22:28:17 +08:00
都想着省事,结果就是维护火葬场,大家一起费事~不如找好规范,折腾下 codegen ,麻烦一次后面就省事了
jinliming2
2021-12-17 22:34:12 +08:00
@NathanDo 你这是故意把代码写复杂了,如果使用原生的 fetch ,相比 application/json ,application/x-www-form-urlencoded 会更简单:
```
fetch('/', {
method: 'POST',
headers:{
'content-type': 'application/json',
},
body: JSON.stringify({
a: 1,
b: 2,
}),
})
```
对比
```
fetch('/', {
method: 'POST',
body: new URLSearchParams({
a: 1,
b: 2,
}),
})
```
原因是浏览器默认网络请求都不认识 json 的,不指定 header 的话都默认 text/plain (如果 body 指定对象的话会自动 toString 变成 [object Object]),而 URLSearchParams 的构造函数就支持直接传对象,并且直接提交自动设置正确的请求头 application/x-www-form-urlencoded 。

@yaphets666 至于 FormData ,通常只会在上传文件的时候才会用(由于设计原因,平常用有点浪费网络资源,弱网环境影响体验)。而上传文件的话,你就要有个文件来源,一般是写一个 form 里带一个 input type="file",而 FormData 天生就为这个场景设计,只要 getElementById 拿到 form 对象,直接传给构造函数 new FormData(form) 就可以了。
同样代码也很简单,也会自动设置正确的请求头 multipart/form-data; boundary=xxx:
```
fetch('/', {
method: 'POST',
body: new FormData(document.getElementById('form')),
})
```

[当然,如果使用的是第三方的网络请求库的话,那应该是 JSON/x-www-form-urlencoded/form-data 站在同等地位啊,具体走什么都取决于封装而已。]
jinliming2
2021-12-17 22:41:44 +08:00
@Austaras 图片用 base64 的话,文件体积会变大 1/3 ,并且代码量都比 FormData 要多了……还不如直接用 FormData 来的简单,并且用 FormData 只会固定大几个字节。
jqtmviyu
2021-12-17 23:39:42 +08:00
喜欢无脑 json, 希望 post 都用 body 传参.
但后端说太麻烦要建实体类, 希望用 get 请求参数放在 query 和 params 里, 但真是别扭呀, 搜接口都不方便, 数据 query, params, body 都有, 乱乱的.
tagtag
2021-12-17 23:40:35 +08:00
什么都行,成套成标准就行,封装一下,用起来没有区别
FightPig
2021-12-17 23:56:37 +08:00
@Oktfolio 写 rails 的人表示从来都按这种来

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/822769

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX