当前位置: 首页 > news >正文

Java | RESTful 接口规范

关注:CodingTechWork

引言

  作为一名程序员,制定清晰、一致且高效的 RESTful 接口规范对于团队的开发效率和项目的长期维护至关重要。本文将详细介绍 RESTful 接口的设计理念、请求方法分类、核心规范,以及正确和错误的示例,帮助团队成员更好地理解和遵循这些规范。

RESTful 接口简介

什么是 RESTful 接口?

  REST(Representational State Transfer,表现层状态转移)是一种基于 HTTP 协议的软件架构风格,由 Roy Fielding 在他的博士论文中提出。RESTful 接口是基于 REST 原则构建的 Web 服务接口,通过统一的资源标识符(URI)和标准的 HTTP 方法(如 GET、POST、PUT、DELETE 等)来实现资源的访问和操作。

REST 的六大原则

RESTful 接口的设计遵循以下六大原则:

无状态(Stateless)

  每个请求从客户端到服务器都应包含理解请求所必需的信息。服务器不会保存任何客户端请求之间的状态信息。这意味着每个请求都是独立的,服务器不会依赖于之前的请求状态来处理当前请求。

统一接口(Uniform Interface)

  无论底层实现如何,资源的管理方式都保持一致。统一接口包括以下四个方面:

  • 资源导向:通过 URI 定位资源。
  • 超媒体作为应用状态的引擎(HATEOAS):客户端通过超媒体链接动态发现可用的资源和操作。
  • 自描述消息:请求和响应消息包含足够的信息,使得客户端能够理解如何处理它们。
  • 超媒体链接:资源之间通过超媒体链接相互关联。
资源导向(Resource-Oriented)

  RESTful 接口的核心是资源。资源是通过 URI 定位的,客户端可以通过 URI 对资源进行操作。资源可以是文档、图片、视频等任何可以被标识的实体。

超媒体作为应用状态的引擎(HATEOAS)

  客户端通过超媒体链接动态发现可用的资源和操作。这意味着客户端不需要提前知道所有可能的资源和操作,而是通过服务器提供的超媒体链接来发现。

自描述消息(Self-Descriptive Messages)

  请求和响应消息包含足够的信息,使得客户端能够理解如何处理它们。例如,HTTP 方法(GET、POST、PUT、DELETE 等)和状态码(200、404、500 等)提供了足够的信息来描述请求和响应。

分层系统(Layered System)

  RESTful 架构可以由多个层次组成,每个层次都有其特定的职责。客户端通常不知道它们是直接与服务器通信,还是与中间层(如代理、网关)通信。

RESTful 请求方法分类

RESTful 接口通过标准的 HTTP 方法来操作资源。常见的 HTTP 方法包括:

GET

  • 用途:用于获取资源。
  • 特点:幂等,请求多次结果相同。
  • 示例
  GET /api/v1/usersGET /api/v1/users/1

POST

  • 用途:用于创建资源。
  • 特点:非幂等,多次请求可能创建多个资源。
  • 示例
POST /api/v1/users

PUT

  • 用途:用于更新资源。
  • 特点:幂等,多次请求结果相同。
  • 示例
PUT /api/v1/users/1

DELETE

  • 用途:用于删除资源。
  • 特点:幂等,多次请求结果相同。
  • 示例
DELETE /api/v1/users/1

PATCH

  • 用途:用于部分更新资源。
  • 特点:非幂等,多次请求可能产生不同结果。
  • 示例
PATCH /api/v1/users/1

RESTful 接口规范

资源的命名

资源的命名应该简洁、直观且具有语义。通常使用名词来表示资源,而不是动词。例如:

  • 推荐:/users
  • 不推荐:/getUser

HTTP 方法的使用

RESTful 接口通过标准的 HTTP 方法来操作资源。常见的 HTTP 方法包括:

  • GET:用于获取资源。
  • POST:用于创建资源。
  • PUT:用于更新资源。
  • DELETE:用于删除资源。
  • PATCH:用于更新部分资源。

正确示例

GET /api/v1/users
POST /api/v1/users
PUT /api/v1/users/1
DELETE /api/v1/users/1
PATCH /api/v1/users/1

错误示例

GET /api/v1/getUser
POST /api/v1/createUser
PUT /api/v1/updateUser
DELETE /api/v1/deleteUser
PATCH /api/v1/UpdateUser/1

状态码的使用

HTTP 状态码用于描述请求的结果。常见的状态码包括:

  • 200 OK:请求成功。
  • 201 Created:资源创建成功。
  • 204 No Content:请求成功,但没有返回内容。
  • 400 Bad Request:请求无效。
  • 401 Unauthorized:未授权。
  • 403 Forbidden:禁止访问。
  • 404 Not Found:资源未找到。
  • 500 Internal Server Error:服务器内部错误。

正确示例

GET /api/v1/users/1
HTTP/1.1 200 OK
{"id": 1,"name": "John Doe","email": "john.doe@example.com"
}POST /api/v1/users
HTTP/1.1 201 Created
Location: /api/v1/users/2
{"id": 2,"name": "Jane Doe","email": "jane.doe@example.com"
}

错误示例

GET /api/v1/users/1
HTTP/1.1 200 OK
{"id": 1,"name": "John Doe","email": "john.doe@example.com"
}POST /api/v1/users
HTTP/1.1 200 OK
{"id": 2,"name": "Jane Doe","email": "jane.doe@example.com"
}

超媒体链接

超媒体链接是 RESTful 接口的重要组成部分。通过超媒体链接,客户端可以动态发现可用的资源和操作。例如:

{"id": 1,"name": "John Doe","email": "john.doe@example.com","links": [{"rel": "self","href": "/api/v1/users/1","method": "GET"},{"rel": "update","href": "/api/v1/users/1","method": "PUT"},{"rel": "delete","href": "/api/v1/users/1","method": "DELETE"}]
}

数据格式

RESTful 接口通常使用 JSON 或 XML 格式来传输数据。JSON 格式因其简洁性和易读性而被广泛使用。例如:

{"id": 1,"name": "John Doe","email": "john.doe@example.com"
}

版本控制

为了保持接口的向后兼容性,建议在 URI 中包含版本号。例如:

/api/v1/users

分页

当返回大量数据时,建议使用分页来提高性能和用户体验。例如:

GET /api/v1/users?page=1&size=10

过滤、排序和搜索

为了提高接口的灵活性,建议支持过滤、排序和搜索功能。例如:

GET /api/v1/users?sort=name,desc
GET /api/v1/users?filter=name:John

相关文章:

Java | RESTful 接口规范

关注:CodingTechWork 引言 作为一名程序员,制定清晰、一致且高效的 RESTful 接口规范对于团队的开发效率和项目的长期维护至关重要。本文将详细介绍 RESTful 接口的设计理念、请求方法分类、核心规范,以及正确和错误的示例,帮助团…...

Baklib优化数字化内容管理用科技提升商业效率与增值潜力

内容概要 在当今数字化迅速发展的时代,数字化内容管理已成为企业提升竞争力的重要手段。Baklib作为一款强大的智能优化内容管理系统,通过先进的科技手段,帮助企业在内容管理和数据整合方面实现高效运作。Baklib 是什么类型的工具&#xff0c…...

【AI日记】25.02.09

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 探索 探索 AI 应用 读书 书名:理解公司:产权、激励与治理作者:张维迎 律己 探索:8 小时作息:2:00-10:00短视频娱乐&am…...

Chrome浏览器原理及优化

1. 相关面试题 1.1. 请说说从输入 URL 到页面渲染完成的全过程 1. 输入URL,用户在浏览器的地址栏输入一个URL,并按下回车键; 2. DNS解析; 浏览器需要将域名转换为服务器的IP地址,以建立连接。 (1). 如果浏览器缓存、操作系统缓存或路由器缓存中已有该域名的IP地址,…...

2025_2_9 C语言中队列

1.队列(先进先出) 队列也是一种受限制的线性结构 它只能在一端添加元素,在另一端访问,删除元素 (队首插入,队尾删除) 因为链表实现没有数组实现快,所以队列大多数是用数组实现的 q…...

[图文]DeepSeek能做对《软件方法》的测试题吗?

目前为止,我已经针对《软件方法》涉及的知识点出了几百道选择题,我们来看一下DeepSeek能不能做对这些题。 在选择题目时,我刻意向后兼容,选择只要受过严谨的软件开发方法学训练,即使没听说过《软件方法》也应该能通过…...

推荐个Deepseek网站

这几天有用到Deepseek,但是官网老时崩溃,硅基流动这个网站感觉还可以用,赠送了十多块钱,用完要收费,但比较便宜,可以接受。 https://siliconflow.cn/zh-cn/models 这里可以设置给模型添加固定的标签需求...

【Linux开发工具】C/C++ 在Linux下的编译器-gcc/g++

目录 一、前言 二、gcc/g的使用 三、程序翻译的四个阶段 1.预处理 2.编译 3.汇编 4.链接 四、动静态库 1.库函数的命名和分类 2. 动静态库的区别 一、前言 学习了vim的使用方法后,我们就可以高效编辑文本文件了,但vim并不像vs一样编辑好.c文件…...

hmi界面:工业设计风格如何识别,有什么应用场景。

一、工业设计风格在 HMI 界面中的视觉特征 (一)简洁的布局 功能分区明确 工业设计风格的 HMI 界面往往将不同的功能模块进行清晰的分区,每个区域都有明确的用途。例如,操作区、显示区、状态区等划分一目了然,用户可以…...

NIO三大组件

文章目录 概述Channel & BufferSelector服务器设计历史演化多线程版设计线程池版设计selector 版设计 概述 NIO的意思是 non-blocking io 非阻塞 IO 。NIO中存在3大组件:Channel 、 Buffer 、Selector Channel & Buffer channel (中文 管道的…...

pytest.fixture

pytest.fixture 是 pytest 测试框架中的一个非常强大的功能,它允许你在测试函数运行前后执行一些设置或清理代码。以下是关于 pytest.fixture 的详细介绍: 一、定义与用途 pytest.fixture 是一个装饰器,用于标记一个函数为 fixture。Fixture 函数中的代码可以在测试函数运…...

MHTML文件如何在前端页面展示

MHTML文件如何在前端页面展示 需求背景: 目前在给证券公司做项目,但是在使用新系统的过程中,甲方还希望之前之前系统的历史记录可以看到。 最初制定的计划是项目组里面做数据的把原系统页面爬取下来,转成图片,直接给…...

学习笔记:在华为云ModelArts上运行MindSpore扩散模型教程

目录 一、背景与目的 二、环境搭建 三、模型原理学习 1. 类定义与初始化 2. 初始卷积层 3. 时间嵌入模块 4. 下采样模块 5. 中间模块 6. 上采样模块 7. 最终卷积层 8. 前向传播 9. 关键点总结 四、代码实现与运行 五、遇到的问题及解决方法 六、总结与展望 教程来源&#xff1a…...

使用sharding-jdbc实现读写分离

简介 读写分离是一种数据库架构设计的模式,主要用于提高数据库的性能和可扩展性。它将数据库的读取操作和写入操作分离到不同的数据库实例上,从而优化系统的负载和响应速度。 实现前提是需要进行主从复制(数据层面的分离) 实现…...

“图像识别分割算法:解锁视觉智能的关键技术

嘿,各位朋友!今天咱们来聊聊图像识别分割算法。这可是计算机视觉领域里特别厉害的一项技术,简单来说,它能让机器“看懂”图像中的不同部分,并把它们精准地分出来。想象一下,机器不仅能识别出图里有猫还是狗…...

【Go语言快速上手】第二部分:Go语言进阶

文章目录 并发编程goroutine:创建和调度 goroutinechannel:无缓冲 channel、有缓冲 channel、select 语句无缓冲 channel有缓冲 channelselect 语句 sync 包:Mutex、RWMutex、WaitGroup 等同步原语Mutex:互斥锁RWMutex&#xff1a…...

GRN前沿:GRETA:从多模式单细胞数据推断基因调控网络方法的比较与评价

1.论文原名:Comparison and evaluation of methods to infer gene regulatory networks frommultimodal single-cell data 2.发表日期:20254.12.21 摘要: 细胞通过基因表达调节其功能,由转录因子和其他调节机制的复杂相互作用驱…...

python基础入门:4.4模块与包管理

Python模块与包管理完全指南:构建可维护的代码结构 # 示例项目结构 """ my_package/ ├── __init__.py ├── core/ │ ├── __init__.py │ ├── utils.py │ └── calculator.py ├── data/ │ └── config.json └── tes…...

《XSS跨站脚本攻击》

一、XSS简介 XSS全称(Cross Site Scripting)跨站脚本攻击,为了避免和CSS层叠样式表名称冲突,所以改为了XSS,是最常见的Web应用程序安全漏洞之一,位于OWASP top 10 2013/2017年度分别为第三名和第七名&…...

LC-两数之和、字母异位词分组、最长连续序列、移动零、盛最多水的容器

两数之和 class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length; // 获取数组 nums 的长度// 外层循环&#xff1a;遍历数组中的每一个元素 nums[i]for(int i 0; i < n; i) {// 内层循环&#xff1a;从 nums[i] 的下一个元素 nums[j] 开始遍…...

Netty源码解析之线程池的实现(二):创建线程与执行任务

前言 先看下面的代码&#xff1a; public class MyTest {public static void main(String[] args) {//创建NioEventLoopGroupNioEventLoopGroup loopGroup new NioEventLoopGroup(3);System.out.println(Thread.currentThread()"准备执行任务");//执行任务for (in…...

IDEA - 一个启动类多次启动方法

More Run/Debug -> Modify Run Configuration -> modify options -> Allow mutiple instances...

U3D支持webgpu阅读

https://docs.unity3d.com/6000.1/Documentation/Manual/WebGPU-features.html 这里看到已经该有的差不多都有了 WOW VFX更是好东西 https://unity.com/cn/features/visual-effect-graph 这玩意儿化简了纯手搓一个特效的流程 如果按原理说就是compute shader刷position&#…...

C++广度优先搜索

简介 老规矩&#xff0c;先来介绍一下什么是广度优先搜索&#xff08;至于这么长时间没更新是为什么&#xff0c;我放在文章结尾了&#xff0c;感兴趣可以看看&#xff0c;以后也是如此&#xff09; 广度优先搜索&#xff0c;从名字就能听出来&#xff0c;他和深度优先搜索关…...

SVN 提交与原有文件类型不一样的文件时的操作

SVN 提交与原有文件类型不一样的文件时的操作 背景 SVN 服务器上原本的文件是软链接类型的&#xff0c;但是我将它改成普通文件再上传。出现了以下提示&#xff1a; 解决过程 本来想着通过 svn rm 和 svn add 来解决&#xff0c;但是行不通。 最终解决方案 svn rm --keep-…...

活动预告 | Power Hour: Copilot 引领商业应用的未来

课程介绍 智能化时代&#xff0c;商业应用如何实现突破&#xff1f;微软全球副总裁 Charles Lamanna 将为您深度解析&#xff0c;剖析其中关键因素。 在本次线上研讨会中&#xff0c;Charles Lamanna 将分享他在增强商业运营方面的独到见解与实战策略&#xff0c;深度解读商业…...

WPF 进度条(ProgressBar)示例一

本文讲述&#xff1a;WPF 进度条(ProgressBar)简单的样式修改和使用。 进度显示界面&#xff1a;使用UserControl把ProgressBar和进度值以及要显示的内容全部组装在UserControl界面中&#xff0c;方便其他界面直接进行使用。 <UserControl x:Class"DefProcessBarDemo…...

【C#】任务调度的实现原理与组件应用Quartz.Net

Quartz 是一个流行的开源作业调度库&#xff0c;最初由 Terracotta 开发&#xff0c;现在由 Terracotta 的一部分 Oracle 所有。它主要用于在 Java 应用程序中调度作业的执行。Quartz 使用了一种复杂的底层算法来管理任务调度&#xff0c;其中包括任务触发、执行、持久化以及集…...

UV - Python 包管理

文章目录 创建 uv 项目已有项目已有uv项目 创建 uv 项目 # 创建项目 uv init m3 # 创建环境 cd m3 uv venv --python 3.11 # 激活环境 source .venv/bin/activate # 添加库 uv add flask 如果创建项目后&#xff0c;给库取别的名字&#xff0c;add 的时候&#xff0c;会…...

pytorch torch.linalg模块介绍

torch.linalg 是 PyTorch 的 线性代数 (Linear Algebra) 子模块&#xff0c;它提供了许多 高效的矩阵操作和分解方法&#xff0c;类似于 NumPy 的 numpy.linalg 或 SciPy 的 scipy.linalg&#xff0c;但针对 GPU 加速和自动微分 进行了优化。 1. 矩阵基本运算 矩阵乘法 torc…...