RESTful 还是 JSON-RPC

前言

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.mfbz.cn/a/873611.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WPF-快速构建统计表、图表并认识相关框架

一、使用ScottPlot.Wpf 官网地址:https://scottplot.net/quickstart/wpf/ 1、添加NuGet包:ScottPlot.Wpf 2、XAML映射命名空间: xmlns:ScottPlot"clr-namespace:ScottPlot.WPF;assemblyScottPlot.WPF" 3、简单示例:…

zhidianyun01/基于 ThinkPHP+Mysql 的智慧园区+智慧园区管理系统+园区物业管理系统+园区物业管理系统源码

园区物业管理系统园区管理系统园区管理园区物业物业管理系统园区物业管理系统源码 软件架构 ThinkPHPMysql 源码合作 提供完整源代码 软件界面展示

AndroidStudio清除重置Http Proxy代理的方式

问题背景 在国内做代码开发的都知道,在国际互联网我们存在看不见的墙,导致无法访问一些代码库和资源,所以在使用开发工具拉取第三方库的时候总会遇到无法连接或者连接超时的情况,所以就会使用一些安全的网络代理工具,辅…

消息队列 MQ 性能大揭秘

RabbitMQ 以下是rabbitmq官方针对RabbitMQ 3.12的性能测试报告,从报告中可以看到他测试的吞吐量是保持在万级的,延迟时间平均在25毫秒左右,最小延时可以达到微秒级。 另外图中还可以看到在低吞吐量的情况下rabbitmq的延迟速度非常的快&…

【C/C++】“秒懂”学C/C++不可错过的“经典编程题” — 日期类的经典运用 (含题链接)

“秒懂”学C/C不可错过的“经典编程题” — 日期类的经典运用 (含题链接) 1. 计算日期到天数转换(1). 解题思路:(2). 代码实现: 2. 打印日期(1). 解题思路:(2). 代码实现: 3. 日期累加(1). 解题思路:(2). 代…

欧拉下搭建第三方软件仓库—docker

1.创建新的文件内容 切换目录到etc底下的yum.repos.d目录,创建docker-ce.repo文件 [rootlocalhost yum.repos.d]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# vim docker-ce.repo 编辑文件,使用阿里源镜像源,镜像源在编辑中需要单独复制 h…

LabVIEW重构其他语言开发的旧系统

在面对一个运行已久、代码不清晰的项目时,如果该项目涉及复杂的通讯协议(如串口和488通讯),重新开发并优化成LabVIEW版本可以极大提升系统的易用性和维护性。为了确保通讯协议的顺利解析和移植,借助专业工具分析现有通…

LLM指令微调实践与分析

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

为elementui的el-date-picker时间选择器添加快捷选项

1、效果图 2、实现方法 直接在elementui的时间选择器上修改,添加shorcuts选项,但是样式要自己修改。 有几个注意点: 1)如图我是选中后有显示背景颜色的,也就意味着要给选中的选项添加类名,elementui没有…

【Python机器学习】核心数、进程、线程、超线程、L1、L2、L3级缓存

如何知道自己电脑的CPU是几核的,打开任务管理器(同时按下:Esc键、SHIFT键、CTRL键) 然后,点击任务管理器左上角的性能选项,观察右下角中的内核:后面的数字,就是你CPU的核心数,下图中我的是16个核心的。 需要注意的是,下面的逻辑处理器:32 表示支持 32 线程(即超线…

2024国赛数学建模C题完整论文:农作物的种植策略

农作物种植策略优化的数学建模研究(完整论文,持续更新,大家持续关注,更新见文末名片 ) 摘要 在本文中,建立了基于整数规划、动态规划、马尔科夫决策过程、不确定性建模、多目标优化、相关性分析、蒙特卡洛…

数据库MySQL零基础-下【详细】

目录 六、事务/视图/触发器/存储过程 1、事务的理解 (1)事务的理解 (2)事务的特性 2、事务的应用 (1)事务的开启与提交 # 语法 # 示例 (2)开启autocommit(临时生…

01* 到底是不是太胖了?

题目&#xff1a; 代码&#xff1a; #include <iostream> using namespace std;#include<stdlib.h> #include<stdio.h>int main() {int n;scanf("%d",&n);for(int i0;i<n;i){int H;scanf("%d",&H);float W;scanf("%f&q…

【信创】Linux终端禁用USB存储 _ 统信 _ 麒麟 _ 方德

原文链接&#xff1a;【信创】Linux终端禁用USB存储 | 统信 | 麒麟 | 方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在Linux终端下禁用USB存储设备的文章。禁用USB存储设备可以提高系统的安全性&#xff0c;防止未经授权的人员将数据拷贝到外部存储设备或…

基于微信小程序+Java+SSM+Vue+MySQL的点餐平台系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSSMVueMySQL的点餐平台系统【附源码文档…

嵌入式-----汇编语言

一.ARM汇编语言程序格式 ARM汇编语言是以段(section)为单位来组织源文件的。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。 段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用到的数据。一个ARM源程序至少需要一个代码段,大的程序…

macos 系统文件操作时提示 Operation not permitted 异常解决方法 , 通过恢复模式 开启 /关闭 SIP方法

在macos系统中操作系统文件时提示 Operation not permitted 这个异常, 原因是因为在macos 10.11以上版本中默认启用了 SIP( System Integrity Protection )机制对系统文件进行保护, 要解决这个问题我们需要关机, 然后进入mac的恢复模式 : 在按电源键开机的同时, 一直按住 co…

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目&#xff1a; 题解&#xff1a; class Solution { public:static const int MASK1 1 << 7;static const int MASK2 (1 << 7) (1 << 6);bool isValid(int num) {return (num & MASK2) MASK1;}int getBytes(int num) {if ((num & MASK1) 0) …

哈希表如何避免冲突

系列文章&#xff1a; 1. 先导片--Map&Set之二叉搜索树 2. Map&Set之相关概念 3. 哈希表如何避免冲突 目录 1.概念 2. 冲突-概念 3. 冲突-避免 3.1 冲突-避免-哈希函数设计 3.2 冲突-避免-负载因子调节 4. 冲突-解决 4.1 冲突-解决-闭散列 4.1.1 线性探…

RMAN Backup Job is Completed Netbackup NBU

RMAN Backup Job is Completed But RMAN Sessions are Not Released in Database When Using Netbackup (Doc ID 2903139.1)​编辑To Bottom In this Document Symptoms Changes Cause Solution APPLIES TO: Oracle Database - Enterprise Edition - Version 19.8.0.0.0 and …