看了一堆的 Restful 的介绍 还是没太理解

2020-05-12 14:41:48 +08:00
 Renco

对于我目前项目中的 请求地址

/user/add 用户新增
/user/delete 用户删除
/user/pageQuery 用户列表拆线呢
/user/detail 用户详情
全是 post 请求,这种算是 Restful 风格嘛

我查了下相关介绍
GET /products : will return the list of all products
POST /products : will add a product to the collection
GET /products/4 : will retrieve product #4
PATCH/PUT /products/4 : will update product #4

大概是请求地址相同 然后是根据 GET POST PUT 这种做交互的才是 Restful 么

5149 次点击
所在节点    程序员
37 条回复
dddd1919
2020-05-12 17:34:20 +08:00
restful 宗旨是在请求的方式上体现你要做的动作,url 表名被操作的资源,类似动宾短语的意思

比如
要获取所有用户列表:GET /users
获取用户 a 的信息 GET /users/a
新建用户 POST /users
更新用户 a 的信息 PUT /users/a
删除用户 a DELETE /users/a
stevenkang
2020-05-12 17:38:27 +08:00
简单版:

GET 查询数据,只读请求,支持幂等调用,对数据不产生任何影响

POST 修改数据,增删改请求,对数据产生影响

没有完全按照 RESTful 的规范来,但用请求 METHOD 区分一下,还是非常有必要的。
passerbytiny
2020-05-12 17:48:53 +08:00
信息系统要想完整的用 RESTful,必须与领域模型结合起来。
这些是面向资源库的操作,分别对应增加、删除、查询实体:
POST /users
DELETE /users/{id}
GET /users?k=v&k=v GET /users/{id}

这些是介于面向资源库和面向实体之间的操作,对资源库来说是修改指定实体,对实体来说是“维修”行为:
PUT /users/{id} “整体换新”
PATCH /users/{id} “换零件”

前面的这些,基本上是通的。即使不是信息系统或者不使用领域模型,例如内容管理系统,当然最典型的还是万维网( www )资源体系,都是这样用(但是不同的背景有不同的具体含义)。而下面这些,则是领域模型专用的,并且是最主要的。他们面向实体,表示实体的一个行为:
POST /users/{id}/eat
POST /users/{id}/drink
POST /users/{id}/shit
POST /users/{id}/xuxu
POST /users/{id}/sleep
POST /users/{id}/... ...


必须纠正一个误区,RESTful 不禁止动词。对于万唯网资源和内容管理系统来说,他们是只对资源做操作从而不会有动词,并不是禁止动词。而信息系统,不只是管理资源,还要支撑业务,是要用到动词的。

手机敲字真累
jswh
2020-05-12 18:21:23 +08:00
RESTful 的核心是资源抽象,用 url 对应对应一个具体的抽象资源,目的是为了语义化(我看到 url 就知道啥意思,我想对一个资源做啥基本不用文档)。另外一个好处是通过 RESTful 可以表达资源之间的关系。狭义的 RESTful api 只是借用了 HTTP 的动词来做相关约定,基本上是约定俗成了。当然也可以不借用 HTTP 动词,用自己的动词形式:

POST /products.retrieve : will return the list of all products
POST /products.add : will add a product to the collection
POST /products/4.retrieve : will retrieve product #4
POST /products/4.update: will update product #4

只不过这种私有私有约定并不友好。
一个简单的判定是不是 RESTful 的方法就是,去掉了动词之后,剩下的 url 是不是你们业务中的一种资源的抽象。你的项目中的例子明显就违背了这一点。

/user/pageQuery 用户列表拆线呢
/user/detail 用户详情

去掉了动词之后,都是 /user/,但他们明显不是一个东西。
liangjx
2020-05-12 18:34:45 +08:00
@whusnoopy 老哥理解深刻
stillyu
2020-05-12 18:53:45 +08:00
@lookas2001
从面向过程编程跃迁到面向对象编程
同意这个说法,运用了这个思想,url 和 http method 怎么定义,都可以团队内自己协商,也都算 restful
SaigyoujiYuyuko
2020-05-12 19:11:11 +08:00
http 动词 + 资源
S4msara
2020-05-12 19:15:57 +08:00
相同 path,不同 method,不同行为
nutting
2020-05-12 19:18:47 +08:00
我感觉最初就是 url 体现参数的一种风格
hantsy
2020-05-12 19:21:32 +08:00
@jswh 不使用 Http Verb 就不能说是 REST API,你可以自称是 Web API 或者 Http API 。

@Renco
@WittBulter 其实自己的 REST API 质量很容易判断,可以自行搜索 Richardson Mature Model (网上介绍太多了),这是一个公认的判断 REST 质量的检测规则。自己比较一下自已设计的 API 到了哪个 Level,Level 2 以下的基本不叫 REST,Level 3 描述的 Self-documentation 特性是比较理想的状态(无需文档基础上可以清楚整个 API 的 schema 的树形结构),实际国外很多公开 API 都做到了( Github,Heroku 等)。国内大厂很多都是在 Level0,或者 Level1,V 站很多人在谈技术的时候往往不讨论技术本身,而是迷信某些大厂怎么做的,所以我一直觉得某些大厂把国内技术带歪了。

另外, 国外已经有相当一部分 API 开始提供 GraphQL,GraphQL 违反 REST 一些设计规则,但是很好的解决 REST 在交换数据上颗粒度的问题。
lewinlan
2020-05-12 20:45:47 +08:00
在标准个瞎搞之间取得平衡+1
至少做到利用 http 四个动词和状态码
JaguarJack
2020-05-13 08:25:38 +08:00
这种当然不算 restful 只是一种标准而已 用不用是你的事儿
ZSeptember
2020-05-13 08:46:50 +08:00
RESTful,本质上是使用资源的状态转移来实现业务,表现出来的形式就是对外暴露对资源的 CRUD
如果,你的业务能用这种状态转移能表达,用还是很不错的,统一,标准
ChanKc
2020-05-13 12:46:16 +08:00
我觉得回帖中九成的人没有看到 restful 的本质。

想一下你浏览 V2EX 的这个过程:你在浏览器输入 v2ex.com 或者从别的网站跳过来。服务器向你发送超媒体文本标记语言(也就是 html ),浏览器渲染后你可以看到这个帖子的链接,于是你知道你可以点这个链接从而看到这个帖子。作为人类你是自我驱动地去看到各种各样的超媒体(图片,链接,表单等等)并去获取各种各样你所要的信息。

理想情况下的 restful 是这样子:你的客户端向 v2ex.com 请求(协议和方法不限),服务器响应的也是一个超媒体,包括一些信息和客户端接下来可以进行的行为。在“人类”的例子里就是 html 和<a>。你的客户端想要看关于 restful 的信息所以它请求了这个帖子的接口,从而获取到了信息。

http 和 http 的方法只是方便了机器之间约定了请求的方法。但是 restful 可以不依赖于具体的网络协议和方法。如果服务器和客户端之间的交流是基于超媒体的,那么即便你全用 post 和 200 也可以是 restful api 。
Yelp
2020-05-13 12:48:36 +08:00
请求方法对应 CRUD,然后参数合理放置:

select * from users

insert into users values(...users)

select * from users where id = 1 limit 1

update users set name = name where id = 1

delete users where id = 1


进阶:

获取用户的收藏

/users/:user_id/coll

user = select * from users where id = 1 limit 1

coll = select * from coll where user_id = user.id
karlkor
2020-05-13 15:14:12 +08:00
RESTful 其实是一个没有固定规范的约定或者说命名风格,就像驼峰命名和下划线命名一样,语法上不是严格要求的,但是一般会遵循这种风格。
比如 Python 里面定义一个变量 amount_of_apple = 10,当然也可以写成 amountOfApple = 10,解释器并不会报错,但是一般会按照第一种风格来写。同样的 HTTP 接口定义成 GET /object/1 或者 GET /object?id=1 都是可以解析的,但是设计接口的时候一般用前者多一些。
no1xsyzy
2020-05-13 15:32:28 +08:00
见到一说,就是在模拟(类比) Unix 文件系统
GET /users = cat /users/*
GET /users/1 = cat /users/1
PUT /users/1 = echo ... > /users/1
GET /users?name=John+Smith = grep "name: John Smith" /users/*

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

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

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

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

© 2021 V2EX