为什么接口设计都不用普通 POST ?


现在很多新的接口设计出来以后,POST 发送的数据都是 json 而不是浏览器中常见的 key=value&key=value 键值对格式。

json 格式的优缺点我还是比较熟悉的,但是在这里键值对格式同样能解决问题。

那么请问为什么这样设计呢?

restful api设计

shefli 10 years ago

x-www-form-urlencoded json 都没有本质区别,那个简单按照那个来。

一般都是先 encode ,传输,再 decode 。对于绝大多数语言, json 都有 encode decode 的库活包。

x-www-form-urlencoded 传输需要注意urlencode,实际上,很多开发不清楚细节的情况下,很容易忽视这个,比如要传输一个带特殊字符的 password ='23af?hello=wrold&bor=far'。忘记urlencode就会是这样:


 password=23af?hello=wrold&bor=far

urlencode才能正确传输,大概是这样:


 password=23af%3Fhello%3Dwrold%26bor%3Dfar

json则是这样


 {
    'password': '23af?hello=wrold&bor=far'    
}

北方棲姫·本気 answered 10 years ago

json的结构可以很复杂,你的键值对的最多只能表示一维关系,而json可以表示多维关系,比如嵌套关系等等。

八月一起一起 answered 10 years ago

其实这个是分情况的。
如果一个注册,就填写手机号、密码、验证码,这自然用json传输和x-www-form-urlencoded传输没什么两样。

如果我需要传一个list,json的优势就体现出来了。
如果我要传一个复杂对象,一级套一级,自然用json更合适。因为如果用x-www-form-urlencoded我必须一级级展开拼成key value对,服务器后端再去一个个接收拼成对象。
如果是json呢,如果我后端是springmvc的话(打个比方,其他也一样)直接用那个对象接收就OK了,还可以使用注解等等,比如@NotNull 自动做校验。

Taiga answered 10 years ago

最简单地答案就是key value的方式无法表达嵌套数据。并且对用户不友好,虽然post的数据抓包也能看到,但99%的用户都不会去看也不想去看。而且json是js的内置格式,方便

xiaoai answered 10 years ago

但是在这里键值对格式同样能解决问题。

一个能快速并直接转化为对象,数组。另外一个不能,或者说你必须知道它是数组还是对象,才能转化。

战场原·路飞 answered 10 years ago

因为大部分后端框架提供的json这个更加易于操作的数据格式

简单.LB answered 10 years ago

你用过node 就懂了,json太好用了

不翔的赶脚 answered 10 years ago

部分反对一个的答案
post的优点是可以随便加东西 毕竟没get的长度限制
至于敏感信息 是对于扔收藏夹的 对于抓包没有任何意义
然后呢 就是json这东西可以无限复杂 反正来回序列化就是了
最后一点 无论get/post 数据转型、类型校验都是必不可少的,永远不要相信用户的输入

听说桐岛要退部 answered 10 years ago

浏览器中的key=value&key=value是拼接在url上然后传递给server的,别说用的是POST请求,其实和GET没啥区别。虽然都能解决问题,但有优劣之分。
1.用KV连接URL,使得URL比较丑陋。
2.用KV连接URL,如果有敏感信息,存在安全问题。
3.用KV连接URL,长度有限制。
如果用JSON,可以使用request body发送数据,就回避了第一点第三点,第二点相对来说要好点。
JSON格式的数据现在比较通用,各种语言支持性都比较好。

里見蓮太郎 answered 10 years ago

  • json 传输是带类型的,你说的传统的 POST Content-Type:application/x-www-form-urlencoded ,就表示虽然也按键/值传递了,但确实字符串,本来数据该有的类型被忽略了。
  • json 类型的数据可以比较好的支持嵌套的数据格式,这种数据格式在后端可以和文档数据库(比如mongodb)的存储结构直接对应;在前端可以和js的数据对象直接对应。

采用 Content-Type:application/x-www-form-urlencoded 势必要增加工作量,譬如:数据转型,类型校验等等

想养布偶的时颜 answered 10 years ago

Your Answer