什么是REST API

2024-06-23 14:52
文章标签 api rest

本文主要是介绍什么是REST API,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 什么是RESTful API

REST API,全称 Representational State Transfer,最初由计算机科学家 Roy Fielding 提出。
是遵循 REST 架构规范的应用编程接口(API),支持与 RESTful Web 服务进行交互。

又被称作 RESTful API,充满Representational State TransferAPI

2. REST API设计规范

2.1 设计规范
  • 将一切数据视作资源
  • 利用HTTP请求方式,描述对资源的操作 (增/删/改/查)
  • 通过HTTP响应状态码,描述对资源的操作结果 (如 : 200/5xx)
2.2 期望效果
  • 看URL知道是什么资源
  • 看Method知道要对资源进行什么操作
  • 看Response Code知道操作是否成功
2.3 Method规范 : 用于描述操作 (动词)
  • GET : 用于读取资源
  • POST : 用于创建资源
  • PUT : 用于更新资源 (客户端提供更新后的完整资源)
  • PATCH: 用于局部更新 (客户端提供资源局部变量)
  • DELETE : 用于删除资源
2.4 URL规范 : 只使用名词,不能有动词

在这里插入图片描述
基于HTTP协议URL对外暴露

  • 标准格式
    • http(s)://域名:端口[/版本]/资源1[1子资源21.../子资源n][/路径变量)
  • 多版本控制
    • GET http(s)://edu.51cto.com/v1.1/blog/article/10
  • 数据查询采用复数
    • GET http(s)://edu.51cto.com/v1.1/blog/articles?categoryld=10
  • 反面典型
    • GET http(s)://edu.51cto.com/article/select by id?id=10
2.5 Response规范 : 需保持统一结构
{code : //描述状态data : 返回数据message : //状态描述
}

可以定义自己的结构,对所有接口的返回结构保持统一就行

2.6 有什么好处

易于理解和实现,支持跨平台和跨语言通信,灵活、扩展性强,使用标准HTTP协议,简化数据交换。
支持多种数据格式,易于缓存和分层架构,提升了应用的开发效率和性能。

2.7 接口设计注意事项
  • 接口要保证幂等性设计
  • 标准化的相应结果集
  • 接口设计采用无状态方案
    • Restful接口每一个请求访问进来应都能得到相同的预期

3. 接口幂等性设计

幂等性 : 当多次重复请求时,接口能够保证与预期相符的结果

例如 : 我们设计了一个为员工涨薪的接口,本次请求发送后为1号员工涨薪500元。

PUT https://edu.lagou.com/employee/salaary
{"id":"1","incr_salary":500}
3.1 如果你是一个新人没有考虑幂等性特性

可能会这么写,伪代码如下 :

//查询1号员工数据
Employee employee = employeeService.selectById(1);  
//更新工资
employee.setSalary(employee.getSalary() + incrSalary);
//执行更新语句
employeeService.update(employee)

对于这段代码,单独运行是没有任何问题的,但是我们要注意 :

在分布式环境下,为了保证消息的高可靠性,往往客户端会采用重试或消息补偿的形式重复发送同一个请求,那么这种情况下这段代码就会出严重问题,每一个重复请求被发送到服务器会让该员工工资增加500,最终该员工工资会大于要求实际应收工资。

3.2 幂等解决方案 : 乐观锁设计

在行业中有一种乐观锁设计,在工资表额外增加一个version字段,代表当前数据的版本,任何对该数据修改操作都会让version字段值+1,这个version数值要求附加在请求中。

PUT https://edu.lagou.com/employee/salaary
{"id":"1","incr_salary":500,"version":1}

数据库

idsalaryversion
130001

相应的,服务器代码也要做出相应变化

//查询1号员工数据
Employee employee = employeeService.selectById(1);  
//更新工资
employee.setSalary(employee.getSalary() + incrSalary);
//设置版本号
employee.setVersion(employee.getVersion() + 1);
//执行更新语句
employeeService.update(employee)

注意此时update方法除了条件id外,还要增加version的判断,如下所示 :

update employee set salary = 3500,version=2 where id=1 and version=1

当执行成功后,1号员工数据库将工资更新未3500,版本为2

idsalaryversion
135002
3.3 如何保证幂等呢 ?

假设客户端再次发送重复的请求

PUT https://edu.lagou.com/employee/salaary
{"id":"1","incr_salary":500,"version":1}

后台逻辑仍然会执行下面的update语句

update employee set salary = 3500,version=2 where id=1 and version=1

此时,因为数据库中version字段已经更新未2,where筛选条件将无法得到任何数据,自然就不会产生实质的更新操作,我们幂等性的初衷就已经达到了。

4. 参考

什么是 REST API 一文读懂 (RESTful API)
【IT老齐170】如何优雅的设计RESTful API接口
REST API 简介 - RESTful Web 服务 (apifox.com)
【前端面试】当被面试官问到什么是 RESTFul-API_哔哩哔哩_bilibili

Postman中的REST API 示例 : Postman REST API basics: CRUD, test & variable

这篇关于什么是REST API的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087468

相关文章

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

python通过curl实现访问deepseek的API

《python通过curl实现访问deepseek的API》这篇文章主要为大家详细介绍了python如何通过curl实现访问deepseek的API,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... API申请和充值下面是deepeek的API网站https://platform.deepsee

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll