为什么接口设计都不用普通 POST ?
现在很多新的接口设计出来以后,POST 发送的数据都是 json 而不是浏览器中常见的 key=value&key=value 键值对格式。
json 格式的优缺点我还是比较熟悉的,但是在这里键值对格式同样能解决问题。
那么请问为什么这样设计呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
其实这个是分情况的。
如果一个注册,就填写手机号、密码、验证码,这自然用json传输和x-www-form-urlencoded传输没什么两样。
如果我需要传一个list,json的优势就体现出来了。
如果我要传一个复杂对象,一级套一级,自然用json更合适。因为如果用x-www-form-urlencoded我必须一级级展开拼成key value对,服务器后端再去一个个接收拼成对象。
如果是json呢,如果我后端是springmvc的话(打个比方,其他也一样)直接用那个对象接收就OK了,还可以使用注解等等,比如@NotNull 自动做校验。
json的结构可以很复杂,你的键值对的最多只能表示一维关系,而json可以表示多维关系,比如嵌套关系等等。
用
x-www-form-urlencoded
和json
都没有本质区别,那个简单按照那个来。一般都是先
encode
,传输,再decode
。对于绝大多数语言,json
都有encode
和decode
的库活包。x-www-form-urlencoded
传输需要注意urlencode,实际上,很多开发不清楚细节的情况下,很容易忽视这个,比如要传输一个带特殊字符的password
='23af?hello=wrold&bor=far'。忘记urlencode就会是这样:urlencode才能正确传输,大概是这样:
json则是这样
json的表现能力比key value格式的更强。
json
传输是带类型的,你说的传统的POST
是Content-Type:application/x-www-form-urlencoded
,就表示虽然也按键/值传递了,但确实字符串,本来数据该有的类型被忽略了。json
类型的数据可以比较好的支持嵌套的数据格式,这种数据格式在后端可以和文档数据库(比如mongodb)的存储结构直接对应;在前端可以和js的数据对象直接对应。采用
Content-Type:application/x-www-form-urlencoded
势必要增加工作量,譬如:数据转型,类型校验等等浏览器中的key=value&key=value是拼接在url上然后传递给server的,别说用的是POST请求,其实和GET没啥区别。虽然都能解决问题,但有优劣之分。
1.用KV连接URL,使得URL比较丑陋。
2.用KV连接URL,如果有敏感信息,存在安全问题。
3.用KV连接URL,长度有限制。
如果用JSON,可以使用request body发送数据,就回避了第一点第三点,第二点相对来说要好点。
JSON格式的数据现在比较通用,各种语言支持性都比较好。
部分反对一个的答案
post的优点是可以随便加东西 毕竟没get的长度限制
至于敏感信息 是对于扔收藏夹的 对于抓包没有任何意义
然后呢 就是json这东西可以无限复杂 反正来回序列化就是了
最后一点 无论get/post 数据转型、类型校验都是必不可少的,永远不要相信用户的输入
你用过node 就懂了,json太好用了
因为大部分后端框架提供的json这个更加易于操作的数据格式
但是在这里键值对格式同样能解决问题。
一个能快速并直接转化为对象,数组。另外一个不能,或者说你必须知道它是数组还是对象,才能转化。
最简单地答案就是key value的方式无法表达嵌套数据。并且对用户不友好,虽然post的数据抓包也能看到,但99%的用户都不会去看也不想去看。而且json是js的内置格式,方便