关于 REST API 设计,我的看法

2015-03-17 11:49:05 +08:00
 yueyoum
如果是设计公共API,你给其他人提供服务,那么老老实实按照规范来,
因为规范就是统一的认知,也不会给别人带来多少困扰。

但如果是自家产品,我的经验就是不要REST了, 所有请求统统POST
参数加密后放入 request body 中

http://wtser.com/2015/03/08/who-cares-about-get-vs-post-norest.html

这篇文章 与我现在的观点一致。


除了文章中所说的,我再说几点好处:

1, 更方便的自动生成代码。
不用区分是GET,POST,DELETE 这些。客户端自动生成代码将极度简化。

2, 数据加密。
上面已经说了, 数据在 post body中,是加密的。
至少不去研究,直接抓包看不出什么。

3, 更方便的服务器安全控制。
自己的API都是POST,可能有一些与第三方厂商对接的接口是GET,
那么只要在nginx中 将第三方GET接口 设置为 可以GET访问
其他接口全部 要 POST 访问,非POST统统deny

4, 更明确的错误提示
客户端有一个输入框,输入其他用户ID (纯数字),可查看这个用户的信息
那么 REST API 就是 GET /userInfo/<ID>

URL ROUTE 配置应该是 <ID> 匹配纯数字 对不对? 这样才是明确的 REST API 啊
如果 用户输入有 汉字, 那么你返回 404呢?
还是返回200 但是 返回结果是这样的?

{
'ok': false,
'message': '用户ID只能是数字'
}

这个时候 客户端只要 判断返回的 ok 不为 true,直接弹框显示 message 即可。




总之我的经验就是全部POST,简单,方便,少写代码!
13271 次点击
所在节点    程序员
76 条回复
maxiujun
2015-03-17 12:23:24 +08:00
想知道一般如何加密post body?
loading
2015-03-17 12:25:12 +08:00
公用 api 设计得再规范,没文档也不行,文档才是重中之重!
zhicheng
2015-03-17 12:28:24 +08:00
你的经验还太少。很多很多很多年前,接口都是这样设计的,一个URL处理所有的请求。
我还有一个非常有趣的问题,如何对 body 加密?AES?Twofish?RSA?ECC?
hbin
2015-03-17 12:37:25 +08:00
不知道用 POST 之后,简单,方便,少写代码在哪
syv2
2015-03-17 12:39:47 +08:00
这是不把自家的前端当人看么
yueyoum
2015-03-17 12:44:30 +08:00
@zhicheng

我没说一个URL啊, 每个功能还是自己的URL


@hbin

请仔细看贴


@syv2

用REST API, 写一大堆文档, 然后 客户端开发人员 对着文档自己写 代码。
这里是 GET, url 是这样的, 这里是 POST, header 应该要加什么什么。

累不累?


我们只要用 配置文件写好简单的规则(xml, ini, ) 自动生成代码。 客户端就像在调用本地方法一样。


对, REST风格的 一样可以 通过配置文件 自动生成代码,但是那个配置文件格式就复杂多了


KEEP IT SIMPLE, STUPID
pyKun
2015-03-17 12:46:12 +08:00
是有这个趋势,但全部post更适合于资源对象操作复杂的时候

比如 aws ec2 管理虚拟机的 api 就是一个 api 对应一个 action
pyKun
2015-03-17 12:50:02 +08:00
比较简单背景的需求,该是restful还是restful吧,楼主引用那个链接里的回复的那个人明显没见过特复杂的场景
yueyoum
2015-03-17 12:51:00 +08:00
@pyKun

恩, 我的现在系统的设计也是 一个api 对应一个 action

只不过不区分GET POST了, 全部POST
yueyoum
2015-03-17 12:56:17 +08:00
@pyKun

我引用一下, 也是因为 看到有人和我一样的观点。

就像 我并不会严格遵循 PEP8 一样, 比如一行不超过80字符。
但有时候别人问我 代码为什么不PEP8, 我只能说 自己方便就行。
你们也是 1080P 全屏IDE 写代码。

但当我看 到 bottle 作者 https://github.com/defnull
自己也说 PEP8 只是规范,不是强制要求, 所以bottle没有严格遵循。 的时候
就会像找到知音一样,找到了观点相同的人。
Catstyle
2015-03-17 13:03:29 +08:00
自动生成客户端接口代码跟用什么method关系很大么...
bkmi
2015-03-17 13:07:47 +08:00
我想问,为什么数据在post body里就是加密的?什么原理?另外用post,相比get简单方便代码少在哪里?
yueyoum
2015-03-17 13:10:17 +08:00
@Catstyle

不大, 但 请不要钻牛角尖

自动生成得有配置文件和规则, 也就是配置文件和生成规则的复杂度问题。

简单有简单的做法
复杂有复杂的做法


我喜欢简单
yuankui
2015-03-17 13:11:57 +08:00
内部使用,就用protobuf呗
yueyoum
2015-03-17 13:18:43 +08:00
@bkmi

关于加密 见 append, 第二个问题 如果你有经验,自然会懂我帖子里的内容
fengliu222
2015-03-17 13:18:54 +08:00
REST的API,对于一个资源的操作,通过不同的请求类型来区分。
用POST的话,应该还需要在URL或参数上进行区分吧,增加了沟通和记忆的成本。
自动生成代码的部分不太懂,但对REST四种请求类型的封装,并非如你所说那么累,而且可读性更高一些。
PS.对着镜子自拍的时候用闪光灯蛮怪的。。。
yueyoum
2015-03-17 13:20:21 +08:00
@yuankui

是的, protobuf, msgpack, 这些库,都可以用。

这也是我 把现在这个项目设计成 反REST 的原因。
mkeith
2015-03-17 13:24:26 +08:00
Post请求比Get请求更耗时间吧
Tr0y
2015-03-17 13:27:48 +08:00
我觉得楼主根本没了解RESTful的实现,RESTful的接口实现的是数据操作上的幂等,用不同的request method,区分不同的操作,对于系统架构的优化和分层都有前置条件和基础,还有前端,移动端,其它平台(客户端) - 后端(服务端)能够实现完全分离,接口统一。

至于接口文档方面大部分的业务根本不需要太详细的说明,只要有数据字典就可以基本描述完绝大多数业务,有需要特别功能接口的才需要单独写接口或文档,关联的业务可以在数据模型中处理。

基于这样的实现,后端只需要开发一次。前端可以使用 angularjs 等框架,移动端是 android,ios。

我们团队的后端基本上写完模型就完成了后端的开发。非常轻松,基本上就在那坐着等前端开发业务,在项目中成本差不多是2:8(后端两天能做完的事情,优秀的前端或者移动端差不多8天才能完成)

建议楼主先熟读Roy Fielding的论文。
adieu
2015-03-17 13:29:12 +08:00
Google的这个库看起来貌似很厉害,如果要做内部api设计可以参考 http://www.grpc.io/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/177478

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX