REST与RPC = 面向对象和函数编程

REST 与 RPC 的争论:

REST API ! = HTTP 远程过程调用
作为开发人员,每当需要 API 时,我们常听到的一句话就是 "哦,我们可以为此开发一个 REST API"。好吧,这没什么不好。
但是,

  • 如果需求是可操作的呢?向服务器发送关于客户端操作的更新,比如点击按钮。

  • 或者获取一些涉及计算的数据--比如获取查询结果,

这些可以称为 REST API 吗?

GET /toptenstories

POST /sendaclientupdate

答案是 "否"!这些是远程过程调用!至于这是不是真正的远程过程调用,另当别论,因为远程过程调用的主要特点是位置透明。客户端进行本地函数调用,但实际上是跳转网络在服务器上执行。但为了简单起见,我还是称之为远程过程调用(Remote Procedure Invocation)。在这里,HTTP 语义并没有被破坏,我使用 GET 来读取一些内容,而使用 POST 来执行一些可能会改变服务器状态的操作。

REST 的核心是资源--资源建模。由于 HTTP 无处不在,我们可以利用 HTTP 工具包来实现 REST 系统。在上述示例中,我们使用 HTTP 作为调用远程程序的传输方式。这就带来了紧密耦合!

REST 的关键特性之一是 HATEOAS,它被认为是使系统完全 REST 化的特性。HATEOAS 是 "超媒体作为应用状态引擎"(Hypermedia as the Engine of Application State)的缩写。它定义了每个资源的 "下一步"。

对于 REST 应用程序接口:

  1. 我们首先需要一个端点,如 https://myrestapi.mydomain.com。

  2. 然后,客户端就可以像浏览网站一样 "浏览 "应用程序接口。

  3. 对资源的每个 GET 请求都会获取有关资源的信息、可对资源执行的操作以及作为超媒体(链接)的相关资源信息。

这确保了客户端和服务器之间的低耦合性。服务器可以更改资源网址,由于客户端使用超媒体来 "浏览 "应用程序,因此资源网址的更改不会影响客户端。

REST != JSON over HTTP
EST 有六个约束条件。
REST 是一种分布式系统的架构风格,如在 HTTP 上运行的网络。
REST 的提出是为了规范在 HTTP 上运行的网络。因此,REST 和 HTTP 有相似之处,也有交叉之处。

但作为一个概念,REST 并不要求以 HTTP 作为传输方式。REST 的要点是使用资源表示法传输状态(应用程序状态和资源状态)。资源可以用 JSON、XML、文本、媒体等多种格式表示。REST 并不规定 JSON 为格式。RESTful 系统的关键在于真正遵守六大约束。

面向过程vs.面向对象
面向过程是一种旨在实现代码重用的机制。您将想要重用的代码包装在可以参数化的签名中,您的工作效率就会立即大大提高。

过程是无状态的。可重用代码对您传递给它的参数进行操作,并且可以选择返回结果。
过程化代码:
DepositMoney(account, amount)

面向对象编程迫使开发人员区分影响过程行为的值或 OOP 术语中的方法以及正在修改的应用程序状态。
面向对象代码:
account.DepositMoney(amount)

两者比较:

  • OOP 方法:非常清楚地表明,account 正在被 amount 更改。

  • 面向过程方法:在更复杂的过程和交互中,开发人员理解可能会变得困难。

REST = OOP

  • Rest中Resource资源等同于OOP的Object对象,只不过是基于Web的系统。
  • 资源与对象的主要区别在于,资源是通过 URL 而不是通过某种引用或指针来访问的。

"面向资源 "对开发人员的好处与 "面向对象 "相同,因为它明确区分了被操作的系统状态和进行操作的方法参数。

HTTP:

POST /accounts/23434/depositMoney
Content-Type: application/json
{
"amount": 100
}
=>
200 OK

然而,很多人会认为这 "不是 RESTful"。

RESTful是将账户“交易”专门建模为“资源”,以便使用 POST 方法创建事务。

POST /accounts/23434/transactions
Content-Type: application/json
{
"type": "deposit" "amount": 100
}
=>
201 OK

虽然后一种设计确实为消费者提供了根据账户查询交易的机会,但它迫使 API 设计者暴露了他们可能并不想支持的资源。

所以这两者都是可行的,符合RESTful

可将 HTTP 方法视为 CRUD 的映射,任何其他动词都违反了这一约束。

在 URL 中加入一个动词并不能让 API 突然变成 RPC。

banq注:其实REST和RPC没有必要分得那么清楚,动词在主语名词后面,还是在名词之前,这取决于上下文

  • 主语思维 是面向对象致命缺点,让主语变成无所不能的上帝,

  • 以动词为先的函数式编程虽然是面向过程的再包装,但是约束比面向过程强很多,在形式逻辑上存在很多要求约束才是函数式编程。

过程化代码:
DepositMoney(account, amount)
这行代码只是过程,不是函数式的,因为有两个方法参数:account, amount,比较歧义,如果变成:
depositMoney(depositCommand)
就清晰清楚了,动作动词depositMoney说明是存款,参数类型是depositCommand命令,命令的意思存款进入指定账户多少钱,amount多少金额包含在depositCommand中。

面向对象代码:account.DepositMoney(amount)
表面上很清晰:以账户为主语,实现存款多少钱,实际上,存款多少钱只是账户的一个上下文场景,账户还有取款多少钱这个上下文。
如果将每个上下文场景涉及的动作都建模到账户中,账户变成一个万能跨越上下文的上帝对象,这是不符合DDD限界上下文中聚合概念。
聚合对象应该被置于上下文BC内,而不是凌驾其上。

https://www.jdon.com/70772.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/222447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【mysql】事务的基本特性和隔离级别?

1 基本特性 1.1 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败。 begin transaction; update account set money = money-100 where name = ‘张…

2037约瑟夫问题(C语言)

目录 一:问题 二:思路分析 三:代码 一:问题 二:思路分析 1.输出结果是按编号输出,所以要考虑数组,数组里面存的数是有编号的,所以把n个人放到数组中,让他们的编号也是…

案例057:基于微信小程序的马拉松报名系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

SQL语法系统性学习,关卡式进阶-学习笔记

学习笔记-SQL语法系统性学习,关卡式进阶 笔记参考:作者鱼皮 关卡式Sql语句学习体验网站 ,网站开源代码 如果想本地体验语法:1.下载大佬开源代码,运行前端项目(推荐); 2.或是自己使…

[云原生] Docker 入门指南:镜像、容器、卷和网络解析

Docker 是一种流行的容器化平台,它以其强大的功能和易用性在软件开发和部署领域广受欢迎。本文将带领您逐步探索 Docker 中的四个核心概念:镜像、容器、卷和网络。通过了解这些概念的是什么、为什么以及如何使用,您将能够更好地理解和利用 Do…

strings

在Go语言中,strings 包提供了许多用于处理字符串的函数。以下是一些常见的用法: 字符串拼接: package mainimport ("fmt""strings" )func main() {str1 : "Hello"str2 : "World"result : strings.Jo…

行为树保姆级教程(以机器人的任务规划为例

行为树 目录 什么是行为树(behavior tree)?行为树的相关术语 行为节点和控制节点不同类型的控制结点: 顺序节点选择节点并行节点装饰结点 机器人的例子:物体搜索 1:如果只存在一个地点A,那么行为树很简单&#xff0…

CSS第二天导读

1,Emmet语法 Emmet语法的前身是Zen coding,它使用缩写,来提高html / css 的编写速度,Vscode内部已经集成该语法 1.1,快速生成HTML结构语法 1.想要快速生成多个相同标签,加上*就可以了,比如 d…

物流实时数仓:数仓搭建(DWD)一

系列文章目录 物流实时数仓:采集通道搭建 物流实时数仓:数仓搭建 物流实时数仓:数仓搭建(DIM) 物流实时数仓:数仓搭建(DWD)一 文章目录 系列文章目录前言一、文件编写1.目录创建2.b…

iPhone 16 的电池供应可能来自印度

据英国《金融时报》报道,据报道,苹果已通知其供应链,包括中国德赛公司和台湾新普科技等电池供应商,其倾向于将 iPhone 16 的电池供应转移到印度。苹果鼓励供应商将现有产能迁往印度,以扩大该地区的生产规模。 鉴于电池…

Redis高级特性解析:持久化、主从复制与哨兵机制全面探讨

Redis持久化 RDB快照(snapshot) 在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存…

Java使用Microsoft Entra微软 SSO 认证接入

1. Microsoft Entra Microsoft Entra ID 是基于云的标识和访问管理服务,可帮助员工访问外部资源。 示例资源包括 Microsoft 365、Azure 门户以及成千上万的其他 SaaS 应用程序。 Microsoft Entra ID 还可帮助他们访问你的企业 Intranet 上的应用等内部资源&#x…

2019年第八届数学建模国际赛小美赛B题数据中心冷出风口的设计解题全过程文档及程序

2019年第八届数学建模国际赛小美赛 B题 数据中心冷出风口的设计 原题再现: 这是数据中心空调设计面临的一个问题。在一些数据中心,计算机机柜是开放的,在一个房间里排列成三到四排。冷却后的空气通过主管进入房间,并分为三到四个…

神经网络中梯度消失 以及梯度爆炸的原因已解决办法

深度神经网络中的梯度消失和梯度爆炸是两个常见的问题,它们都会导致网络训练过程中的梯度无法有效传播或者传播过于剧烈,从而影响网络的收敛性和性能。下面将详细介绍这两个问题以及解决方案。 梯度消失问题: 梯度消失指的是在网络的深层结…

python相关工具代码之网络图片下载并显示出下载图片保存到的地址

# codingutf-8 from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * import time import random import os import urllib.request from bs4 import BeautifulSoup 信号传参类型 pyqtSignal() #无参数信号 pyq…

【华为数据之道学习笔记】5-2华为数据湖的特点

华为数据湖是逻辑上对内外部的结构化、非结构化的原始数据的逻辑汇聚。数据入湖要遵从6项入湖标准,基于6项标准保证入湖的质量,同时面向不同的消费场景提供两种入湖方式,满足数据消费的要求。经过近两年的数据湖建设,目前已经完成…

centos7安装和卸载MySQL8.0

一.卸载Mysql 1.关闭MySQL服务 systemctl stop mysqld 2.使用 rpm 命令查看已安装的安装包 rpm -qa|grep mysql 3.使用yum卸载安装的mysql yum remove mysql mysql-server mysql-libs mysql-server 4.查询剩余的安装包 rpm -qa|grep mysql 这里是我的centos7上的mysq…

Docker容器数据卷

一、概念 1.定义 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。 卷的设计目的就是数据的持久化,完全独…

0-50KHz频率响应模拟量高速信号隔离变送器

0-50KHz频率响应模拟量高速信号隔离变送器 型号:JSD TA-2322F系列 高速响应时间,频率响应时间快 特点: ◆小体积,低成本,标准 DIN35mm 导轨安装方式 ◆六端隔离(输入、输出、工作电源和通道间相互隔离) ◆高速信号采集 (-3dB,Min≤ 3.5 uS,订…

谷歌上架或更新被拒审的可能原因有哪些?

众所周知,在Google play应用商店上架或更新应用时,开发者需要遵守谷歌的相关规定和政策,否则可能会导致审核不通过,甚至永久封号。 很多开发者在提交应用到谷歌Play商店或进行应用更新时,即便了解了Google Play商店的…