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


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

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

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

restful api设计

shefli 10 years, 1 month 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, 1 month ago

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

八月一起一起 answered 10 years, 1 month ago

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

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

Taiga answered 10 years, 1 month ago

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

xiaoai answered 10 years, 1 month ago

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

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

战场原·路飞 answered 10 years, 1 month ago

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

简单.LB answered 10 years, 1 month ago

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

不翔的赶脚 answered 10 years, 1 month ago

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

听说桐岛要退部 answered 10 years, 1 month 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, 1 month ago

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

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

想养布偶的时颜 answered 10 years, 1 month ago

Your Answer