z-950 / blog

This is a blog for myself
0 stars 0 forks source link

web api风格 浅谈 #6

Open z-950 opened 4 years ago

z-950 commented 4 years ago

由于是web api,主要考虑使用http、websocket的交互方式,也即http和websocket的api设计风格。

从http的语义角度入手

调用api,实际上就是信息传递。这里信息传递包括了请求和响应。

简单起见,先只考虑使用http协议调用api。

从纯post到RESTful

最初接触到前后端交互并自己进行开发,很理所当然的按最“简单”的方式设计api:所有请求数据都使用json并塞进http的body里,同时所有返回数据同样使用json塞进body里。

此处的“简单”并非真的简单,自行解析和处理数据,实际上不比利用http字段并使用相关函数处理简单。

后面了解到更多关于http的知识,并且了解到RESTful api规范,自然而然会使用RESTful风格的api。

迁移确实有成本,但下文会给出迁移成本低的理由。

纯post和RESTful的语义

前面提到了调用api实际上是信息传递。我们来看一下纯post和RESTful有哪里不一样。

首先可以肯定的是,经过设计,纯post能表达的信息量与RESTful是一样甚至更多的。

具体他们的区别:纯post是语义的聚合,RESTful是语义的分散。聚合,指的是大部分的信息都集中在http的body中。分散,指的是信息分散在http的各个字段中。

也即他们的区别是,对http使用方式的不同。纯post往往需要将http已有的字段重新定义一次,对http的利用率是较低的。纯post与RESTful风格的api比较,它们对path的设计也不同:纯post往往会把method放入path;而对于RESTful来说,method就是http的method。

也就是说,如果不了解http,那么设计纯post api会再设计出类似http的一套东西。那么为什么不学习http并直接转向RESTful风格呢?自行设计需要踩坑,效率通常比学习现有的东西低。即便是需求复杂,http的字段无法满足,http和RESTful的知识也能为设计提供思路。

纯post和JSON-RPC

JSON-RPC实际上就是比较完整的纯post信息交换设计。实际需要时可供参考。

对于websocket

由于websocket在正式通信过程中仅有消息内容,与http丰富的字段不同。协议本身限制了通信过程中只能使用类似http的纯post的方式。(socket.io有命名空间和事件实际上也是对消息内容的设计)

所以JSON-RPC同样适合websocket。

关于RPC

虽然RPC主要是在服务间进行,但浏览器也可以当作一个服务(渲染服务),并且通常只作为调用者。

RPC和RESTful

RPC面向方法,RESTful面向资源,但无论怎么样,调用时都需要知道相关的地址(RPC的注册中心,RESTful的资源解析)和对应的参数,对于调用者来说,两者区别不大。

上面是经典的误解。RPC调用强调的是 函数调用,如何实现网络通信是函数调用的底层,也就是说,纯post(JSON-RPC)和RESTful都能作为RPC的网络交互设计风格。具体如何选择,看需求、接口的复杂程度。

这两者其实不应该相提并论,具体区别可以参考:如何理解RPC和REST (注:RESTful是REST使用http的一种实现)