awesome-fenix icon indicating copy to clipboard operation
awesome-fenix copied to clipboard

「Comment」https://icyfenix.cn/architect-perspective/general-architecture/api-style/rest.html

Open fenixsoft opened this issue 4 years ago • 26 comments

https://icyfenix.cn/architect-perspective/general-architecture/api-style/rest.html

fenixsoft avatar Apr 14 '20 13:04 fenixsoft

在互利网中,面向资源来进行网络传输是这三十年来HTTP协议精心培养出来的用户习惯。 周大哥,“在互利网中”是笔误,“在互联网中”?

dengchaoh avatar Dec 10 '20 03:12 dengchaoh

@dengchaoh 在互利网中,面向资源来进行网络传输是这三十年来HTTP协议精心培养出来的用户习惯。 周大哥,“在互利网中”是笔误,“在互联网中”?

感谢!已修改,下次commit时更新

fenixsoft avatar Dec 10 '20 04:12 fenixsoft

周老师,对于返回{code: xxx, message: "xxx", data: xxx}这种设计如何看待?是否是违背了RMM第2级的使用HTTP协议的Status Code,因此是RMM 1级?

UUNNFLY avatar Dec 23 '20 11:12 UUNNFLY

@UUNNFLY 周老师,对于返回{code: xxx, message: "xxx", data: xxx}这种设计如何看待?是否是违背了RMM第2级的使用HTTP协议的Status Code,因此是RMM 1级?

这种与REST谈不上有什么关系,最初的源头是JSON-RPC协议,但JSON-RPC Specification中也只是规定了在error中带code和message,现在有不少程序,包括一些较为有名的产品都发展到凡是交互就必定返回个code的程度。我个人不太感冒,但确实是很普遍的现状。

fenixsoft avatar Dec 23 '20 12:12 fenixsoft

将“REST 与 RPC 在思想上差异的核心是抽象的目标不一样,既面向过程的编程思想与面向资源的编程思想两者之间的区别。”后半句中的“面向过程的编程思想”和“面向资源的编程”位置互相调换一下会不会好一点?第一次读到以为 REST 是“面向过程”,RPC 是“面向资源”,这和上一章的理解产生了偏差。

1a2yd09 avatar Jun 05 '21 14:06 1a2yd09

将“REST 与 RPC 在思想上差异的核心是抽象的目标不一样,既面向过程的编程思想与面向资源的编程思想两者之间的区别。”后半句中的“面向过程的编程思想”和“面向资源的编程”位置互相调换一下会不会好一点?第一次读到以为 REST 是“面向过程”,RPC 是“面向资源”,这和上一章的理解产生了偏差。

有道理,已修正

fenixsoft avatar Jun 06 '21 01:06 fenixsoft

所以REST不翻译成表征会不会好一点,表征这个词印象中就没在中文里见到过

holiday12138 avatar Jun 29 '21 12:06 holiday12138

@fenixsoft

将“REST 与 RPC 在思想上差异的核心是抽象的目标不一样,既面向过程的编程思想与面向资源的编程思想两者之间的区别。”后半句中的“面向过程的编程思想”和“面向资源的编程”位置互相调换一下会不会好一点?第一次读到以为 REST 是“面向过程”,RPC 是“面向资源”,这和上一章的理解产生了偏差。

有道理,已修正

“既面向过程的编程思想与面向资源的编程思想两者之间的区别” 是不是应该是“即”

holiday12138 avatar Jun 30 '21 02:06 holiday12138

"于是双进行预约确认" 是否是"于是又进行预约确认"

coldJune avatar Jul 05 '21 07:07 coldJune

POST /appointmentService?action=comfirm HTTP/1.1

应为confirm

ssheh avatar Jul 15 '21 02:07 ssheh

POST /appointmentService?action=comfirm HTTP/1.1

应为confirm

已修正,感谢。

fenixsoft avatar Jul 15 '21 03:07 fenixsoft

REST设计是否有常用场景的各种best practice的总结文章,这样会“拿来主义”会方便很多 O(∩_∩)O

xyhere2001 avatar Aug 16 '21 16:08 xyhere2001

运作良好的缓存机制可以减少客户端、服务器之间的交互,甚至有些场景中可以完全避免交互,"这就进一步提了高性能"。 这就进一步提高了性能。QAQ

QitanCai avatar Aug 17 '21 05:08 QitanCai

"以前,人们面向方法去设计 RPC API,譬如 CORBA 和 DCOM,随着时间推移,接口与方法越来越多却又各不相同,开发人员必须了解每一个方法才能正确使用它们,这样既耗时又容易出错。

—— Google API Deign Guide" 这里的“Deign”应该为“Design”

XuyiK avatar Aug 20 '21 07:08 XuyiK

有点疑惑, 医生和档期都是资源, 如果2个资源有关系时该怎么设计?

获取医生档期 GET /doctors/mjones/schedule?date=2020-03-04&status=open HTTP/1.1

那如果是要获取所有医生的档期该怎么命名呢?

预约确认 POST /schedules/1234 HTTP/1.1

为什么不是 POST /doctors/mjones/schedules/1234 HTTP/1.1

sunyj-003 avatar Sep 09 '21 09:09 sunyj-003

@sunyj-003 有点疑惑, 医生和档期都是资源, 如果2个资源有关系时该怎么设计?

获取医生档期 GET /doctors/mjones/schedule?date=2020-03-04&status=open HTTP/1.1

那如果是要获取所有医生的档期该怎么命名呢?

预约确认 POST /schedules/1234 HTTP/1.1

为什么不是 POST /doctors/mjones/schedules/1234 HTTP/1.1

2、有档期ID=1234(1234就是代表mjones医生在14:00~14:50的档期),即使没有/doctors/mjones这些请求信息,服务器端也是能获取医生信息的。

AnyUncle avatar Nov 16 '21 13:11 AnyUncle

个人认为面向资源编程只是面向过程编程的一种特例,怎么说呢,资源的形成源自于建模,在图形学中,已经建立好的单个模型我们称之为对象,也即资源。REST对于web这种已经建立好的访问模式来说,自然是以资源先入为主了

loadnil avatar Dec 11 '21 07:12 loadnil

目前来看,rest风格并不适用于国内大部分项目

anxiaoyuuuu avatar Feb 09 '22 03:02 anxiaoyuuuu

“所希望的是除了第一个请求是有你在浏览器地址栏输入所驱动之外” ——“有你”应为“由你”

YangYuChina avatar Feb 09 '22 12:02 YangYuChina

Rest 对监控来说是不是不够友好,比如 GET /user/1 这种,本来想监控 查询用户接口的QPS, 但是会按路由展示了 每个用户查询了多少次

Ikki-Dai avatar Mar 01 '22 11:03 Ikki-Dai

讲的很好

zhaoyan519 avatar Mar 08 '22 02:03 zhaoyan519

@sunyj-003 有点疑惑, 医生和档期都是资源, 如果2个资源有关系时该怎么设计?

获取医生档期 GET /doctors/mjones/schedule?date=2020-03-04&status=open HTTP/1.1

那如果是要获取所有医生的档期该怎么命名呢?

预约确认 POST /schedules/1234 HTTP/1.1

为什么不是 POST /doctors/mjones/schedules/1234 HTTP/1.1

我也有这样的疑惑,上文中不是提到了统一接口吗?应该用GET、Put去操作资源

QYGK avatar Mar 29 '22 01:03 QYGK

周老师,REST中统一接口的概念,是不是说用相同的路径去请求同一个资源,用不同的请求方法比如GET、POST来区分不同的目的

QYGK avatar Mar 29 '22 01:03 QYGK

@loadnil 个人认为面向资源编程只是面向过程编程的一种特例,怎么说呢,资源的形成源自于建模,在图形学中,已经建立好的单个模型我们称之为对象,也即资源。REST对于web这种已经建立好的访问模式来说,自然是以资源先入为主了

是否可以这么认为?面向对象时把太多东西设置为了对象,这对调用方产生了不必要的麻烦。而面向资源编程,则只代码中关心的最最重要的部分抽象为资源

ZGarry avatar Apr 02 '22 02:04 ZGarry

REST 与 HTTP 完全绑定,不适合应用于要求高性能传输的场景中。

其实REST和HTTP并无完全绑定的关系,正如您文中所说的REST是架构风格,HTTP是应用层的协议。只因REST是伴随设计HTTP和URI协议过程中的产生的理论指导思想。比如在2014年一个基于UDP的CoAP(http://coap.technology)就是符合REST的架构风格的另外一个协议。

关于性能的问题,Fielding在他的那篇博士论文中把性能拆分为用户感知的性能、网络性能和网络效率三部分来衡量。通常来讲RPC关注的点大都在于提升网络性能(选择基于TCP而不是HTTP)、网络效率(采用protobuf而不是json),而很少去关注用户感知的性能这个指标。但是这个指标其实才是我们最终追求的最重要的衡量指标,所以REST中定义了缓存+分层系统这2个架构约束,然后HTTP支持了这两个约束,由此才催生出了CDN,这也对应了REST论文中的一个观点(An interesting observation about network-based applications is that the best application performance is obtained by not using the network)。同时HTTP/2也在改善了HTTP协议本身的性能,HTTP/3在尝试解决传输层TCP的性能问题,这些协议层面的优化在应用层是完全无感知就可以享受到的,这一点相比RPC的私有协议是要更通用方便一些的。不过也正是其通用的request/response模型,导致其无法适用于需要双向实时通信这种场景。

REST的目标在于如何有效的利用网络;RPC的目标大都在于如何屏蔽网络差异,让消费方尽可能的当作一个本地function来使用用。

linianhui avatar May 21 '22 17:05 linianhui

实际中感觉rest接口不好用,太繁琐。为了减少出错,连接口都是统一用POST

lichkingyang avatar Nov 08 '22 07:11 lichkingyang