请问,我这样理解 restful 对不对?

2015-10-02 04:08:11 +08:00
 legendlee
最近设计了两个小型的前后端交互 api 接口系统,参考了 restful 的标准。但是我读的材料可能不够多,对 rest 理解的有点模糊,想让大家纠正一下。

目前而言,我理解的 rest 就是两句话: url 里面不允许出现任何动词,只能用来表示寻址。
并且保证所有能用 url 寻址找到的资源对象都支持同样的动词操作(比如增删改查),不支持的可以返回错误,但绝不能支持额外的方法。

至于别的,比如是完全用 /分割的 url 还是使用传统带的?和&的 url ,是使用标准的 http get/post ,还是把动词放在 body 里,似乎没什么区别。

请问这样理解对吗?
5650 次点击
所在节点    程序员
30 条回复
legendlee
2015-10-02 04:12:33 +08:00
另外,我感觉如果按照我这样的理解,那么我们完全有可能设计出一种 dsl 描述语言,把各种资源对象的结构和约束,以及操作的鉴权等描述出来,然后编写一个生成器,把基本的前后端逻辑代码生成出来,至少大部分模块生成出来(和数据库无关的部分)。

请问这么做现实吗?有没有现有的这样的系统?
msg7086
2015-10-02 04:31:06 +08:00
不太确定你的理解是否正确,反正我们是肯定得允许额外动词的。

#1 楼 你说的是 Rails generator 吗
ryanemax
2015-10-02 08:51:08 +08:00
Restful api markup language
raml.org 官网
背后支持 angularjs 团队, mule


raml2html raml 转 html
RAMLang angular 生成
Api Design mule 大开源的 ide

Demo:
api.anasit.com
api.anasit.com/doc
raml.anasit.com
matsuijurina
2015-10-02 08:53:07 +08:00
建议楼主去尝试一下 rails scaffold ,会豁然开朗的。
ryanemax
2015-10-02 09:13:51 +08:00
@ryanemax 后端的生成器也很多,参考 raml.org 的 product 页面,如果没有的可以自己造轮子,用官方提供的 parser ,团队在尝试做 laravel5(基本不用做)和 golang 的 generator
legendlee
2015-10-02 09:16:21 +08:00
@ryanemax 嗯,谢谢,这东西好。有点孤陋寡闻了。最近用 nodejs 搞了个简单的内容管理,里面有些东西就是自己写代码生成的,但是比较简陋。
xavierskip
2015-10-02 09:51:52 +08:00
URL 用来定位资源, HTTP 描述操作。
Lucius
2015-10-02 10:09:48 +08:00
“ RESTful 架构有一些典型的设计误区。
最常见的一种设计错误,就是 URI 包含动词。因为"资源"表示一种实体,所以应该是名词, URI 不应该有动词,动词应该放在 HTTP 协议中。”

via: http://www.ruanyifeng.com/blog/2011/09/restful.html
imzshh
2015-10-02 10:35:37 +08:00
URL 在 REST 风格的 api 里面只是用来定位一个资源,用不用动词,是不是出现 query string 都没问题。其它内容像是如何利用现有的 HTTP 协议表示 CURD 等操作,处理错误、缓存,怎么进行并发控制、身份验证等等,这些约定才是 RESTful 的精髓。
legendlee
2015-10-02 10:36:36 +08:00
@Lucius 好像跟我想的差不多。
imzshh
2015-10-02 10:44:52 +08:00
@Lucius 这种说法才是对 RESTful 的错误认识,这里说的资源是一个抽象概念,出现动词并不会改变它是一个资源的本质。并且在真正 RESTful 的服务器和客户端的交互中,客户端并不关心 url 的格式是怎样的, url (也就是资源)都应该由服务器(通过类似 html 里的链接的方式)告诉客户端,而不是客户端自行生成。
Lucius
2015-10-02 10:50:19 +08:00
@imzshh
你的理解是错误的, RESTful 的基本原则概括成一句话就是

“ URL 定位资源,用 HTTP 动词( GET,POST,DELETE,DETC )描述操作。”
imzshh
2015-10-02 10:53:39 +08:00
@Lucius 这句话里有说 URL 里不能出现动词吗?
Lucius
2015-10-02 10:55:43 +08:00
@imzshh

如果你认为 URL 里出现动词是合理并且规范的,那么后面半句标准根本就没有意义
canesten
2015-10-02 10:57:36 +08:00
@Lucius
所以一个合格的 Restful 的站就是按照不同 HTTP 动词对 URL 资源进行增删改查?
我是觉得只有 GET,POST,DELETE,PUT 好像并不能表达一些复杂的业务。
还是说 Restful 的设计就一定要避免复杂业务?
Lucius
2015-10-02 11:01:51 +08:00
@canesten

我觉得 URL 里出现的应该是实践的 结果 例如 “ products ” 这个名词

而不是一个过程、动作 例如 “ get-products ”
imzshh
2015-10-02 11:08:40 +08:00
@Lucius 这么说吧, URL 中不出现动词当然是极好的,但是有时候难免会出现不得不出现动词的情况。传统的带?和&的 URL 在 REST 风格的接口中也是可以出现的,进行查询( query 不是 get )的时候也应该使用。我想要表达的是 URL 怎么设计只是整个 REST 架构风格中很小的一点,不要认为 URL 没有出现动词没有?和&了就 RESTful 了,反之就不是 RESTful 了。
canesten
2015-10-02 11:13:02 +08:00
@Lucius
所以你说的还是简单业务
对于增删改查我承认你的看法
但是其实现实中很多不得不妥协
因为 HTTP 动词表达不了复杂语义
就像#17
@imzshh
说的一样
hantsy
2015-10-02 11:16:46 +08:00
@legendlee 参考这里讨论。 http://www.v2ex.com/t/221304

@ryanemax RAML 从一开始回到了 SOAP 的老路,这是使用 REST 的程序员最不希望看到。记得使用 SOAP 的时候,讨论的一个最基本的问题就是 Contract First 还是 Code First ,基于 SOAP 多于牛毛的各种规范,导致 Contract First 占优势。从技术人员的角度看,大部分都是愿意使用 Code First ,这也是 REST API 很盛行代替 SOAP 的原因。

RAML 最初也是 Swagger 描述中抽象出来的。 Swagger 初衷是可视 REST API ,我已经在项目已经使用了两年以上 Swagger 。但 Swagger 不支持 REST API Rechardson Model Level3 , 如 HAL 等。 HAL Browser 更简单一些。
initdrv
2015-10-02 11:20:20 +08:00
看看大牛们的见解,新手 mark 一下!

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

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

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

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

© 2021 V2EX