RESTful 还是 JSON-RPC

news2024/11/15 17:59:45

前言

RESTful
比较简单地说就是,大家请求一样的url(GET方法有一个例外,url中带了一个id),通过不同的请求方法,分别进行不同的操作(CRUD)。

JSON-RPC
JSON-RPC是一个无状态且轻量级的远程过程调用(RPC)传送协议,通过JSON传递内容。远程过程调用意思就是,用函数思维写API,用JSON传值,返回一个JSON。

RESTful的逻辑思维比较难转换
初学coding,比较定式的是函数的思维,考虑的是输入什么、输出什么。而RESTful面向资源的思维在写一些功能的时候就会比较别扭,考虑以下例子:写一个根据uid获取用户信息的接口。

JSON-RPC:输入用户的uid,输出用户的信息
REST:先用POST方法创建一个资源(查询),再GET请求一个资源(刚才创建的查询)
相比之下,REST的一个问题就暴露出来:一定要把所有东西都变成资源,然后再要把对应的操作映射成“增删改查”(HTTP的四个方法)。有时候一些很简单的功能,例如一个登录的功能,使用RESTful的话就会演变成十分复杂的问题,化简为繁没必要。

RESTful 在业务简单、有大量静态资源的情况下有优势
在研究过程中我看到了许多例子,都是用的博客、新闻之类的网站应用举的例子,实际上这些比较共同的特点就是里面有比较多的静态资源,而且业务逻辑相对比较简单,可以用简单的CRUD就能搞定了。那么优势在哪里呢?

例如获取某一篇文章的接口,因为请求某个资源,所以这个接口应该会使用GET方法,在url中直接带上文章的id来获取文章。

比较显而易见的就是,GET请求可以被缓存。意思是,如果有一个人向web服务器GET请求,那么这个请求会被缓存起来,下一个同样的GET的时候,就会从缓存中取出上一次的返回,在高并发场景下缓存的引入能够有效提高性能。如果使用POST JSON的方法,每次web服务器都需要去调用底下的PHP或者Java之类,会增大开销。

另外一个比较细微的地方是,POST实际需要两次TCP,而GET只需要一次。尽管实践证明两种方法在网络良好时差距不大,但或多或少是一个优化的点。

然而考虑另外一个场景:搜索一篇文章。

首先这里缓存的意义就没有那么大了,每个用户输入的关键词可能都会不一样,之前的缓存优势没有了。然后,如果搜索中有多个条件,有可能会超出URL的上限(URL最大长度2048),还可能因为搜索条件中有中文等特殊字符出现编码等问题,且搜索中不能包含敏感信息之类,比较麻烦。可能有人会说,GET也可以在Body里面放JSON呀!标准来说GET应该是没有Body的,对比RESTful追求的“规范”有一些打脸。另外也没有办法解决上限的问题,可以说POST一个JSON可以一劳永逸。

GET?POST?
这个是研究这两个方式的时候衍生出的另一个问题:什么时候用GET?什么时候用POST?

毫无疑问,GET适合获取静态资源,通过QueryString获取参数;而传递JSON、包含敏感信息等应该用POST。但再来看两个我觉得比较经典的、微信开发文档的例子:

getAccessToken

这是一个获取AccessToken的接口,这里就使用了GET的方法,我觉得原因有以下几个

传递的都是ASCII字符,不受GET方法的限制
appid和secret已经是相对乱码,也没有加密的必要
接口的功能比较简单,参数固定
请求的频率会比较高(考虑每次操作都需要这个token,且token比较容易过期)
再看另一个发送消息的接口。

subscribeMessage.send

这个接口就使用了POST的方法(尽管也有一个参数在url中)。分析如下

需要传递的内容较多,且可能有中文、特殊字符等,可能会超出GET的长度和字符限制
这里access_token没有放在json中,而是放在了url里。从功能上看这个放在json和url里都没有问题,可能是为了方便开发,服务端可以直接把前端送过来的json数据直接再传递给微信接口
接口结构比较复杂,而且多变。发送的消息根据模板可以有不一样的结构(每个模板的可以填的空、空的类型之类都不一样)
请求的频率比较低(不一定,不好做判断)
通过这个例子应该比较好理解。
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_43409309/article/details/105330430

RESTFUL

http://www.ruanyifeng.com/blog/2014/05/restful_api.html

比较简单地说就是,大家请求一样的url(GET方法有一个例外,url中带了一个id),通过不同的请求方法,分别进行不同的操作(CRUD)。

web 应用程序,一般分为前端和后端两个部分。前后端通信通常需要一种统一机制,以方便不同的前端设备与后端进行通信。这种需求导致了 API 构架的流行,甚至出现 “API First” 的设计思想。

RESTful API 是目前比较成熟的一套 web 应用程序的 API 设计理论,用于 web 前后端的数据交互。

RESTful API 路径

RESTful API 的路径又称 “终点”(endpoint),表示 API 的具体网址。

在 RESTful 架构中,每个网址代表一种资源(resource),比如:有一个 API 提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样:

https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees

RESTful API HTTP 动词

在 RESTful API 设计理论中,对于资源的操作,由 HTTP 动词表示。

常用的 HTTP 动词有下面五个(括号里是对应的数据库 SQL 命令)。

  • GET(SELECT):从服务器取出资源(一项或多项)。
  • POST(CREATE):在服务器新建一个资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
  • DELETE(DELETE):从服务器删除资源。

还有两个不常用的HTTP动词。

  • HEAD:获取资源的元数据。
  • OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。

比如

  • GET /zoos:列出所有动物园
  • POST /zoos:新建一个动物园
  • GET /zoos/ID:获取某个指定动物园的信息
  • PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
  • PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
  • DELETE /zoos/ID:删除某个动物园
  • GET /zoos/ID/animals:列出某个指定动物园的所有动物
  • DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物

下面是一些例子

RESTful 即 Representational State Transfer 的缩写。直接翻译的意思是 “表现层状态转化”,是一种互联网应用程序的API设计理念:URL 定位资源,用 HTTP 方法描述操作,例如:

  1. 获取文章 /blog/getXxx Get blog/Xxx
  2. 添加文章 /blog/addXxx POST blog/Xxx
  3. 修改文章 /blog/updateXxx PUT blog/Xxx
  4. 删除文章 /blog/delXxxx DELETE blog/Xxx

在这里插入图片描述

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

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

相关文章

SpringBoot学习(7)(Bean对象注册)(自定义组合注解)

目录 一、引言 二、案例学习 (一)Bean (二)Import 三、补充 (1)关于Java中collection.toArray(new String[0])解释 (2)组合注解 一、引言 上次学习了解到,springb…

基于机器学习的阿尔兹海默症智能分析预测系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 阿尔兹海默症(Alzheimers Disease, AD)是一种常见的神经退行性疾病,主要影响老年人的认知功能。随着全球人口老龄化的加剧,阿尔兹海默症的患病率逐年…

nodejs 使用kafka案例,node-red配置kafka案例,从安装配置kafka开始

生产者测试: bin/kafka-console-producer.sh --broker-list 1.2.3.4:9092 --topic test-topic消费者测试: bin/kafka-console-consumer.sh --bootstrap-server 1.2.3.4:9092 --topic test-topic --from-beginningconst { Kafka } require(kafkajs)con…

【AIGC数字人】EchoMimic:基于可编辑关键点条件的类人音频驱动肖像动画

GitHub:https://github.com/BadToBest/EchoMimic 论文: https://arxiv.org/pdf/2407.08136 comfyui: https://github.com/smthemex/ComfyUI_EchoMimic 相关工作 Wav2Lip Wav2Lip是一个开创性的工作 ,但输出会出现面部模糊或扭…

粒子群算法原理的示例介绍

一:粒子群优化算法的介绍 粒子群优化算法(PSO)是一种基于群体智能的优化算法,于1995年提出。它受到鸟群狩猎行为的启发,通过模拟鸟群或鱼群的社会行为来进行问题的求解。 基本原理 粒子群算法中,每个解决…

顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测,优化前后对比

顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测,优化前后对比 目录 顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测,优化前后对比预测效果基本介绍…

一种小众且适合发文的智能优化算法应用——三维TSP问题

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 今天给大家介绍一种非常小众的智能优化算法应用&am…

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等…

2024/9/9 408“回头看”:

B树是什么?有什么作用?B树的插入和删除具体细节是什么?除了B树还有一个是B+树、还是B-树,他们有什么区别,又有什么相同点? b树在王道考研查找这一章,所以他的主要作用就是查找。 在…

MySQL中binary放在判断语句之前有什么作用

为什么要加binary进行判断 ① 因为 mysql中等号比较是不区分大小写的,select aA这个输出结果为1。 ② 在判断语句之前 加上binary可以以区分大小写比较 ,因为这样底层会用二进制形式比较,实现精确匹配。 代码比较 忽略大小写比较 select …

Ftrans跨域文件传输方案,数据流动无阻的高效路径

大型集团企业由于其规模庞大、业务广泛且往往将分支机构、办事处分布在多个地域,因此会涉及到跨域文件传输的需求。主要源于以下几个方面: 1.业务协同:集团内部的不同部门或子公司可能位于不同的地理位置,但需要进行紧密的业务协…

【C++】STL学习——priority_queue(了解仿函数)

目录 priority_queue介绍迭代器种类priority_queue实现仿函数仿函数的使用 priority_queue介绍 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素&#x…

Linux 磁盘管理-RAID磁盘冗余阵列看这一篇就够了

今天给伙伴们分享一下Linux 磁盘管理-RAID磁盘冗余阵列,希望看了有所收获。 我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到…

机器学习深度学习

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 深度学习概述 1.1 定义与历史背景 深度学习作为机器学习领域的一个重要分支,其核心在于构建由多层(深层)的人工神经网络组成的计算模型,这些模型能够学习数据的多层次抽象表示。深度学习的…

东大成贤资源库-数据挖掘技术与应用 实验一:数据预处理_熟悉数据挖掘数据预处理流程。 基于给定的数据集(csv)文件,完成下列数据处理。 1

【实验内容】 程序清单 import pandas as pd import numpy as np# 读入文件,存放在字典data里 data pd.read_csv("D:\\Desktop\\data1.csv")# 填入Id列空缺的值 for i in range(1,len(data)):if pd.isnull(data[Id][i]):data[Id][i]i1# Id属性列去重&a…

虚拟机的安装步骤

我这里使用的是VMware 1.下载centos7 2.配置 跟这图来就好 开启虚拟机 第一个页面直接回车,忘了截图 等待安装 选择语言,看自己 点击完成 点击继续安装 设置账号密码 然后等待就行 安装完成之后会有一个重启,点击(又忘了截图) 完成许可和网络 最后就可以了

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵…

数据权限的设计与实现系列7——前端筛选器组件Everright-filter用法说明

背景 官方给了全局性的介绍和示例,不过到了具体使用环节,介绍就不是那么清楚明确了,往往是直接放 demo,需要去推测和揣测,然后动手验证。去百度了下,也没找到现成的对该组件的使用说明,得以开荒…

Unreal Fest 2024 虚幻引擎影视动画制作的普遍问题

一 毛发缓存数据巨大的问题(及5个解决方案) 在引擎里模拟毛发,并且把它缓存下来,我们就不需要从外部导入了,所以我们要解决的问题就是怎么样在引擎里自由地控制毛发 1.物理场控制 延申 [技术分享]《UE中的世界物理场…

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素