关于 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,简单,方便,少写代码!
13290 次点击
所在节点    程序员
76 条回复
zooandzoo
2015-03-17 22:45:06 +08:00
mark
dalang
2015-03-18 00:04:03 +08:00
最近一个项目设计 api 的时候跟一个前端沟通,对方也谈及类似思路。严格 REST 在有些条件下会遇到困难,比较常见的就有不使用 put 请求,全部使用 post。
9hills
2015-03-18 00:23:39 +08:00
@funsunz #49 这个理解赞。@yueyoum 的想法没错,只是找错了门路。

lz其实不想要HTTP的那些语义,只是想把HTTP作为传输层。那么问题来了,HTTP其实不太适合做传输层,为什么不换其他的传输层呢。
9hills
2015-03-18 00:30:23 +08:00
另外对BODY加密就是脱裤子放屁多次一举,直接HTTPS好了。

既然要好省快,却还要造不必要的轮子,也是不理解。。。
puncsky
2015-03-18 07:34:50 +08:00
既然不是 RESTful API,就老老实实叫 HTTP API,不用赶时髦。
caixiexin
2015-03-18 08:54:51 +08:00
@funsunz 说的挺有道理。
我觉得RESTful就是一种url组织方式吧,让设计的接口更http,更像资源而不是能力,有些场景下非常利于理解,比如各种开放平台的api。
现在很多的RESTful api其实是一种妥协的RESTful,因为很多浏览器或客户端工具对put和delete支持不好,所以只用post和get方式,然后在url后面加个“create”“update”“delete”的动词表示post,put,delete,比如新浪微博的很多api
说个最近用RESTFul体会到的好处,可以做到前后端完全分离,大大造福我们后端码农,经常接口开发完就给丢给前段,很多事都不用管了←_←
ps:有时候我也很疑惑,RESTful好在哪里。程序员的世界就是天天有大牛提出新概念新技术试图引导技术潮流,我等码农能做到不在这个潮流中迷失就很不错了 = =
wy315700
2015-03-18 09:16:06 +08:00
我举个例子

POST是不允许重发的
GET,PUT,DELETE都是在超时以后允许重发的。

如果在设计的时候不按RESTful设计,可能就会出问题
cloudzen
2015-03-18 09:19:00 +08:00
RESTful不是银弹,亦如当年的AJAX
min
2015-03-18 09:38:42 +08:00
这套架构出来不少年了,业界已经有比较清楚的定义

自己弄一套适合自己的用法没问题,但是和RESTful就没关系了
mengzhuo
2015-03-18 10:46:29 +08:00
典型的书读的,设计也看的不多……
repus911
2015-03-18 17:08:25 +08:00
@est 你的例子才是错误的吧...
est
2015-03-18 20:32:04 +08:00
@repus911 那么什么是对的呢?
fengliu222
2015-03-18 22:18:50 +08:00
@est 我的例子纯属抄袭,原文在我提供的链接里。。
yingluck
2015-03-20 17:22:13 +08:00
@est 试了一下 发现真的是 涨见识了
这说明 HTTP动词是隔离于HTTP协议的
感谢
est
2015-03-20 18:02:33 +08:00
@yingluck 但是这仅仅是RFC允许的而已。实际操作中。。。。。很多硬件软件都不支持这样干。
yingluck
2015-03-20 19:46:18 +08:00
@est 硬件不支持? 您说的是防火墙过滤?
这给我的启发是method仅仅是个名字而已,可以换套更贴合实际的新动词实现Restful API

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

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

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

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

© 2021 V2EX