Java | RESTful 接口规范

news2025/2/10 7:33:16

关注: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/users
  GET /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

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

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

相关文章

Chirpy3D:用于创意 3D 鸟类生成的连续部分潜在特征

Chirpy3D框架可以将细粒度的2D图像理解提升至3D生成的全新境界。当前的3D生成方法往往只关注于重构简单的对象,缺乏细致的特征和创造性。Chirpy3D通过结合多视角扩散模型和连续的部件潜在空间,能够生成全新且合理的3D鸟类模型。该系统不仅能够保持细致的…

viem库

viem是一个用于和以太坊进行交互的javascript库,它提供了简单的API进行智能合约的读取和写入操作,你可以使用它来与区块链上智能合约进行交互,查询链上数据等。 基本功能 1,创建公有客户端 createPublicClient 可以创建一个链接…

【每日一题 | 2025】2.3 ~ 2.9

个人主页:GUIQU. 归属专栏:每日一题 文章目录 1. 【2.3】P8784 [蓝桥杯 2022 省 B] 积木画2. 【2.4】P8656 [蓝桥杯 2017 国 B] 对局匹配3. 【2.5】[ABC365D] AtCoder Janken 34. 【2.6】P8703 [蓝桥杯 2019 国 B] 最优包含5. 【2.7】P8624 [蓝桥杯 2015…

整数拆分cpp

题目如下 思路:根据数论知识,要使乘积最大化,将该数拆分成3和2即可,一直对该数进行减三操作,直到该数小于等于4即可 代码如下 谢谢观看

DeepSeek之Api的使用(将DeepSeek的api集成到程序中)

一、DeepSeek API 的收费模式 前言:使用DeepSeek的api是收费的 免费版: 可能提供有限的免费额度(如每月一定次数的 API 调用),适合个人开发者或小规模项目。 付费版: 超出免费额度后,可能需要按…

如何在WPS和Word/Excel中直接使用DeepSeek功能

以下是将DeepSeek功能集成到WPS中的详细步骤,无需本地部署模型,直接通过官网连接使用:1. 下载并安装OfficeAI插件 (1)访问OfficeAI插件下载地址:OfficeAI助手 - 免费办公智能AI助手, AI写作,下载…

神经网络常见激活函数 6-RReLU函数

文章目录 RReLU函数导函数函数和导函数图像优缺点pytorch中的RReLU函数tensorflow 中的RReLU函数 RReLU 随机修正线性单元&#xff1a;Randomized Leaky ReLU 函数导函数 RReLU函数 R R e L U { x x ≥ 0 a x x < 0 \rm RReLU \left\{ \begin{array}{} x \quad x \ge 0…

【分布式理论7】分布式调用之:服务间的(RPC)远程调用

文章目录 一、RPC 调用过程二、RPC 动态代理&#xff1a;屏蔽远程通讯细节1. 动态代理示例2. 如何将动态代理应用于 RPC 三、RPC序列化与协议编码1. RPC 序列化2. RPC 协议编码2.1. 协议编码的作用2.2. RPC 协议消息组成 四、RPC 网络传输1. 网络传输流程2. 关键优化点 一、RPC…

【Maven】项目管理工具-Maven

目录 1. Maven简介 1.1 项目管理 1.2 项目构建 1.3 项目构建工具 1.4 Maven的四大特征 1.4.1 依赖管理系统 1.4.2 多模块构建 1.4.3 一致的项目结构 1.4.4 一致的构建模型和插件机制 1.5 Maven模型 ​编辑 2.maven的安装配置 2.1 Maven的安装配置 2.1.1检测jdk的版…

ASP.NET Core WebSocket、SignalR

目录 WebSocket SignalR SignalR的基本使用 WebSocket WebSocket基于TCP协议&#xff0c;支持二进制通信&#xff0c;双工通信。性能和并发能力更强。WebSocket独立于HTTP协议&#xff0c;不过我们一般仍然把WebSocket服务器端部署到Web服务器上&#xff0c;因为可以借助HT…

【学术投稿】第五届计算机网络安全与软件工程(CNSSE 2025)

重要信息 官网&#xff1a;www.cnsse.org 时间&#xff1a;2025年2月21-23日 地点&#xff1a;中国-青岛 简介 第五届计算机网络安全与软件工程&#xff08;CNSSE 2025&#xff09;将于2025年2月21-23日在中国-青岛举行。CNSSE 2025专注于计算机网络安全、软件工程、信号处…

26~31.ppt

目录 26.北京主要的景点 题目 解析 27.创新产品展示及说明会 题目​ 解析 28.《小企业会计准则》 题目​ 解析 29.学习型社会的学习理念 题目​ 解析 30.小王-产品展示信息 题目​ 解析 31.小王-办公理念-信息工作者的每一天 题目​ 解析 26.北京主要的景点…

网络工程师 (28)IEEE802标准

前言 IEEE 802标准是由电气和电子工程师协会&#xff08;IEEE&#xff09;制定的一组局域网&#xff08;LAN&#xff09;和城域网&#xff08;MAN&#xff09;标准&#xff0c;定义了网络中的物理层和数据链路层。 一、起源与背景 IEEE 802又称为LMSC&#xff08;LAN/MAN Stand…

背包问题1

核心&#xff1a; // f[i][j] 表示只看前i个物品&#xff0c;总体积是j的情况下&#xff0c;总价值是多少 //res maxx(f[n][]0-v] //f[i][j]: //1 不选第i个物品 f[i][j] f[i-1][j] //2 选第i个物品 f[i][j] f[i-1][j-v[i]] w[i]

Spring 中的设计模式详解

控制反转(IoC)和依赖注入(DI) IoC(Inversion of Control,控制反转) 是 Spring 中一个非常非常重要的概念&#xff0c;它不是什么技术&#xff0c;而是一种解耦的设计思想。IoC 的主要目的是借助于“第三方”(Spring 中的 IoC 容器) 实现具有依赖关系的对象之间的解耦(IOC 容器…

人类的算计与机器的算计

近日&#xff0c;国外一视频网站博主通过设定&#xff0c;使DeepSeek和ChatGPT开展了一场国际象棋对弈。前十分钟双方在正常对弈&#xff0c;互有输赢&#xff0c;且ChatGPT逐渐占优。随后DeepSeek突然以对话方式告诉ChatGPT&#xff0c;国际象棋官方刚刚更新了比赛规则&#x…

7 使用 Pydantic 验证 FastAPI 的请求数据

FastAPI 是一个快速、现代的 Web 框架&#xff0c;它提供了自动生成 OpenAPI 文档的功能&#xff0c;支持 Pydantic 模型进行请求和响应数据的验证。Pydantic 提供了强大的数据验证功能&#xff0c;可以帮助你确保请求的有效性&#xff0c;自动进行数据转换&#xff0c;并生成详…

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&#…

Mac安装配置使用nginx的一系列问题

brew安装nginx https://juejin.cn/post/6986190222241464350 使用brew安装nginx&#xff0c;如下命令所示&#xff1a; brew install nginx 如下图所示&#xff1a; 2.查看nginx的配置信息&#xff0c;如下命令&#xff1a; brew info nginxFrom:xxx 这样的&#xff0c;是n…

在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。

题目&#xff1a;在CT107D单片机综合训练平台上&#xff0c;8个数码管分别单独依次显示0~9的值&#xff0c;然后所有数码管一起同时显示0~F的值&#xff0c;如此往复。 延时函数分析LED首先实现8个数码管单独依次显示0~9的数字所有数码管一起同时显示0~F的值&#xff0c;如此往…