为什么接口设计都不用普通 POST ?
现在很多新的接口设计出来以后,POST 发送的数据都是 json 而不是浏览器中常见的 key=value&key=value 键值对格式。
json 格式的优缺点我还是比较熟悉的,但是在这里键值对格式同样能解决问题。
那么请问为什么这样设计呢?
Answers
用
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'
}
其实这个是分情况的。
如果一个注册,就填写手机号、密码、验证码,这自然用json传输和x-www-form-urlencoded传输没什么两样。
如果我需要传一个list,json的优势就体现出来了。
如果我要传一个复杂对象,一级套一级,自然用json更合适。因为如果用x-www-form-urlencoded我必须一级级展开拼成key value对,服务器后端再去一个个接收拼成对象。
如果是json呢,如果我后端是springmvc的话(打个比方,其他也一样)直接用那个对象接收就OK了,还可以使用注解等等,比如@NotNull 自动做校验。
-
json
传输是带类型的,你说的传统的POST
是Content-Type:application/x-www-form-urlencoded
,就表示虽然也按键/值传递了,但确实字符串,本来数据该有的类型被忽略了。 -
json
类型的数据可以比较好的支持嵌套的数据格式,这种数据格式在后端可以和文档数据库(比如mongodb)的存储结构直接对应;在前端可以和js的数据对象直接对应。
采用
Content-Type:application/x-www-form-urlencoded
势必要增加工作量,譬如:数据转型,类型校验等等