深度理解Restful开发规范【总结】

article/2025/8/2 18:44:06

目录

💙一、为啥要遵循 Restful 开发规范

❤️二、Restful 初印象

💚(一)啥是 Restful

💜(二)核心原则

💙三、Restful 在 Java 中的实战

💛(一)定义资源类

❤️(二)处理请求与响应

💚四、Restful 与 HTTP 状态码的默契配合

💜五、Restful 的进阶玩法:版本控制与安全性

💛(一)版本控制

💙(二)安全性

❤️六、常见问题与解决办法

💚(一)URL 设计不合理

💛(二)HTTP 方法滥用

💙(三)状态码使用错误

💚七、总结与展望

家人们,今天我得跟你们唠唠我在 Java 编程里学到的一个超重要、超实用的东西 ——Restful 开发规范。

💙💙💙💙💙💙💙💙💙💙💙💙💙💙💙

其实只要知道restful是个统一响应结果,是一定的开发规范,也可以不用的,只是用了会比较专业一点,感觉比较牛逼一点,装逼一点。深入理解的话,再看下面多方面整理的材料。能更深入的理解。

💙💙💙💙💙💙💙💙💙💙💙💙💙💙💙

0efbe5608ba84cac87c04260586463c3.gif

💚一、为啥要遵循 Restful 开发规范

咱们先来说说,为啥在 Java 开发里,这个 Restful 规范这么重要。以前啊,要是开发一个应用,前后端沟通的接口可能设计得乱七八糟。比如说,获取用户信息的接口叫 getUserInfo,更新用户信息的接口叫 updateUser,删除用户信息的接口又叫 deleteUserById,每个接口名字都不一样,而且参数传递、返回值格式也没个统一标准。这就导致后端开发人员得记一堆接口名字和用法,前端开发人员调用的时候也容易出错,要是项目大了,接口多了,维护起来简直是噩梦。

8f133218aa2f4cccbff3f11231ef60c2.gif

而且,要是换了个新的前端团队或者后端团队接手项目,得花好多时间去熟悉这些乱糟糟的接口,耽误开发进度。但有了 Restful 规范就不一样啦,它就像一套清晰明了的交通规则,让接口之间 “井井有条”。它规定了用统一的 HTTP 方法(像 GET、POST、PUT、DELETE 等)来对应不同的操作,用特定的 URL 格式来定位资源,让前后端人员一看就懂,不管是开发新功能还是维护老代码,都轻松多了,是不是一下子解决了大难题?所以说,学好 Restful 规范,对咱们写好 Java 程序、高效开发项目那可太关键啦!

0ed3fd00122d45498937ea604367161e.gif

💛二、Restful 初印象

❤️(一)啥是 Restful

简单来讲,Restful 是一种软件架构风格,它基于 HTTP 协议,把网络上的一切都当作资源,通过统一的接口来对这些资源进行操作。咱们可以把它想象成一个超级有序的图书馆,里面的每一本书、每一个书架、每一个阅览室都是资源,而读者(也就是咱们的客户端,像手机 APP、网页浏览器等)通过一些固定的 “借阅规则”(HTTP 方法和 URL 路径)来获取、借阅、归还这些资源,图书管理员(服务器端)按照规则来处理,保证整个过程顺畅又高效。

💙💙💙💙💙💙💙💙💙💙💙💙💙💙💙

在 Java 开发里,遵循 Restful 规范,咱们就能把应用里的用户信息、商品信息、订单信息等都当成资源,用标准的方式来处理它们,让程序的接口部分清晰易懂,易于维护。

💙💙💙💙💙💙💙💙💙💙💙💙💙💙💙

💜(二)核心原则

💙

  1. 资源定位:每个资源都要有一个唯一的 URL 标识,就像图书馆里每本书都有一个独一无二的索书号一样。比如说,获取所有用户信息的 URL 可以是 /users,获取某个特定用户信息(假设用户 ID 是 1)的 URL 就是 /users/1,这样通过 URL 就能直接定位到想要的资源,简单明了。

💙

❤️

  1. 统一接口:使用 HTTP 协议里的标准方法来操作资源。比如,用 GET 方法获取资源,就像咱们去图书馆查找书籍,只是看看书的内容,不做修改;用 POST 方法创建新资源,相当于往图书馆新增一本书;PUT 方法更新资源,类似于修改书中的内容;DELETE 方法删除资源,就是把书从图书馆移除。这样前后端开发人员不用再额外沟通接口的操作方式,按照 HTTP 标准来就行。

❤️

💚

  1. 无状态:服务器不保存客户端的上下文信息,每次请求都是独立的,就像每次去图书馆借书,管理员不管你之前借过啥书,只看你这次的借阅需求。这样服务器端的设计更简单,也更容易扩展,不用担心因为保存太多客户端状态而导致内存溢出等问题。

💚

💚三、Restful 在 Java 中的实战

❤️(一)定义资源类

咱们先来看看在 Java 项目里,怎么定义符合 Restful 规范的资源类。假设咱们开发一个简单的博客系统,有文章资源。首先,创建一个 Article 类:

public class Article {private Long id;private String title;private String content;private Date createTime;// 构造函数、getter 和 setter 方法省略
}

这就是咱们的文章资源实体类,里面包含了文章的基本属性,像 ID、标题、内容、创建时间等。

接着,创建 ArticleResource 类来处理与文章相关的 Restful 操作:

@Path("/articles")
public class ArticleResource {@GET@Produces(MediaType.APPLICATION_JSON)public List<Article> getArticles() {// 这里实现从数据库或其他数据源获取所有文章的逻辑return articleService.getAllArticles();}@GET@Path("/{id}")@Produces(MediaType.APPLICATION_JSON)public Article getArticleById(@PathParam("id") Long id) {// 实现根据 ID 获取特定文章的逻辑return articleService.getArticleById(id);}@POST@Consumes(MediaType.APPLICATION_JSON)@Produces(MediaType.APPLICATION_JSON)public Article createArticle(Article article) {// 实现创建新文章的逻辑,比如保存到数据库return articleService.createArticle(article);}@PUT@Path("/{id}")@Consumes(MediaType.APPLICATION_JSON)@Produces(MediaType.APPLICATION_JSON)public Article updateArticle(@PathParam("id") Long id, Article article) {// 实现根据 ID 更新文章的逻辑,注意这里可能需要合并原文章和传入文章的信息article.setId(id);return articleService.updateArticle(article);}@DELETE@Path("/{id}")public void deleteArticleById(@PathParam("id") Long id) {// 实现根据 ID 删除文章的逻辑,比如从数据库删除articleService.deleteArticleById(id);}
}

这里,@Path("/articles") 注解标注了这个资源类对应的基础 URL 是 /articles,里面的各个方法分别对应不同的 HTTP 操作。@GET 注解表示这个方法用来获取资源,@Produces(MediaType.APPLICATION_JSON) 说明返回的数据格式是 JSON 格式,方便前端处理。@POST@PUT@DELETE 注解同理,分别对应创建、更新、删除操作,而且通过 @PathParam 注解获取 URL 中的参数,比如文章 ID,是不是很清晰?

5c06d7d0b8344ab59fc21892b8828c22.png

💛(二)处理请求与响应

在实际项目里,咱们还得处理好请求和响应。继续以博客系统为例,在 getArticles 方法里,咱们从数据库获取所有文章后,要确保返回的 JSON 数据格式正确,让前端能轻松解析:

@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Article> getArticles() {List<Article> articles = articleService.getAllArticles();// 可以在这里对文章列表进行一些预处理,比如按照创建时间排序Collections.sort(articles, Comparator.comparing(Article::getCreateTime).reversed());return articles;
}

在创建文章的 createArticle 方法里,要验证传入的文章数据是否合法,比如标题不能为空,内容要有一定长度等:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Article createArticle(Article article) {if (article.getTitle() == null || article.getTitle().isEmpty()) {throw new BadRequestException("文章标题不能为空");}if (article.getContent() == null || article.getContent().length() < 100) {throw new BadRequestException("文章内容至少要有 100 字");}return articleService.createArticle(article);
}

这里假设咱们定义了一个 BadRequestException 异常类,用来返回 400 错误给前端,让前端知道是请求数据有问题。通过这些处理,咱们保证了前后端交互的顺畅,让 Restful 接口更健壮。

💜四、Restful 与 HTTP 状态码的默契配合

在 Restful 规范里,HTTP 状态码可是个重要 “角色”,它和接口操作紧密配合,给客户端传递关键信息。

0019e8f4d5124251afadf2c961c1f51c.gif

比如说,当咱们用 GET 方法成功获取到资源,就返回 200 OK 状态码,告诉客户端请求成功,数据已经拿到了,就像咱们去图书馆顺利借到了书,管理员给咱们一个 “借阅成功” 的示意。

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

如果用 POST 方法创建新资源成功,返回 201 Created 状态码,并且在响应头里可以带上新创建资源的 URL 地址,方便客户端后续操作,相当于图书馆新增了一本书,管理员不仅告诉咱们新增成功,还把书放在哪个书架、给个索书号啥的都告知了。

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

要是客户端发起的请求有问题,比如在创建文章时,传入的数据不合法,像前面提到的标题为空,那就返回 400 Bad Request 状态码,让客户端知道是自己的请求有误,赶紧调整。

💜💜💜💜💜💜💜💜💜💜💜💜💜💜💜

如果要获取的资源不存在,用 GET 方法请求 /articles/999,但实际上没有 ID 为 999 的文章,就返回 404 Not Found 状态码,提示客户端资源没找到,就像咱们去图书馆找一本不存在的书,管理员告诉咱们书不在这儿。

💜💜💜💜💜💜💜💜💜💜💜💜💜💜💜

而在更新或删除资源时,如果因为权限问题,比如说普通用户想删除别人的文章,服务器不允许,那就返回 403 Forbidden 状态码,禁止客户端的非法操作,像图书馆规定某些珍贵书籍只有特定人员能借阅、修改或删除,其他人想动就会被制止。通过合理使用这些 HTTP 状态码,咱们让 Restful 接口的反馈更加准确、易懂,客户端能快速了解请求的结果,做出相应的处理。

💚五、Restful 的进阶玩法:版本控制与安全性

(一)版本控制

随着项目的发展,咱们的 API 可能需要升级,增加新功能、修改接口参数等,这时候版本控制就很重要了。一种常见的方法是在 URL 中带上版本号,比如 /v1/articles 表示版本 1 的文章资源接口,/v2/articles 表示版本 2 的。这样,老版本的客户端仍然可以使用 /v1/articles 接口,不受影响,而新版本的客户端可以切换到 /v2/articles,利用新功能。

在代码里,可以这样实现:

@Path("/v1/articles")
public class ArticleResourceV1 {// 版本 1 的接口实现,和前面类似
}@Path("/v2/articles")
public class ArticleResourceV2 {// 版本 2 的接口实现,可能有新的方法或修改过的方法
}

通过这种方式,咱们实现了 API 的平滑升级,避免了因为版本更新而导致老客户端无法使用的问题,是不是很巧妙?

💚(二)安全性

在 Restful 接口中,安全性也不容忽视。咱们可以采用多种方式来保障安全。首先,使用 HTTPS 协议,让数据传输加密,防止被中间人窃取,就像给信件装在加密信封里邮寄,别人看不到内容。

其次,对于敏感资源的访问,比如用户的隐私信息、支付信息等,要进行身份验证和授权。可以采用 OAuth 等标准协议,让用户登录后获取令牌,每次请求带上令牌,服务器验证令牌的有效性,只有合法用户才能访问相应资源,就像进图书馆的珍贵藏书室,得有专门的通行证,不是谁都能进。

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

另外,对于一些可能遭受攻击的接口,像登录接口,要防止暴力破解,可以设置验证码、限制登录次数等措施,保护系统安全,确保 Restful 接口在安全的环境下运行,让用户放心使用咱们开发的应用。

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

💛六、常见问题与解决办法

💚(一)URL 设计不合理

有时候咱们在设计 URL 时,没有遵循资源定位原则,导致 URL 混乱复杂,不易理解。比如说,获取某个分类下的文章,写成 /getArticlesByCategory?category=科技,这样既不符合 Restful 的风格,又不利于搜索引擎优化。解决办法是重新设计 URL,按照资源定位,写成 /categories/科技/articles,清晰地表明是获取 “科技” 分类下的文章资源,让 URL 本身就具有描述性。

💛(二)HTTP 方法滥用

有些开发者可能不熟悉 HTTP 方法的正确用法,滥用方法。比如,本来应该用 PUT 方法更新资源,却用了 POST 方法,导致接口语义不清晰。解决之道是深入学习 HTTP 协议,理解每个方法的含义和适用场景,严格按照 Restful 规范使用,在团队内部制定代码审查制度,及时发现并纠正这种错误。

8e11f27e839a481a8ed699683a67b57e.gif

💜(三)状态码使用错误

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

在返回 HTTP 状态码时,容易出现错误,比如不管什么情况都返回 200 OK,让客户端无法准确判断请求结果。解决办法是仔细研究 HTTP 状态码的定义,根据不同的操作结果和错误类型,准确返回相应状态码,并且在开发过程中,对每个接口进行充分测试,确保状态码的正确性。

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

❤️七、总结与展望

家人们,今天给你们讲了这么多关于 Java 里 Restful 开发规范的事儿,希望对大家有用吧。

cc544e95803f4a1c9c98c23bfd7eee1d.gif


http://www.hkcw.cn/article/DEIgLygeDy.shtml

相关文章

【SF顺丰】顺丰开放平台API对接(Java对接篇)

对接前置篇&#xff1a; 【SF顺丰】顺丰开放平台API对接&#xff08;注册、API测试篇&#xff09;_顺丰api接口对接指南-CSDN博客 1.实现效果展示 2.SF顺丰开放平台&#xff0c;JDK资源下载。 下载地址&#xff1a;顺丰开放平台 3.将下载的JDK放入项目中。 4.将JDK资源引入p…

Java 大视界 —— Java 大数据在智能建筑室内环境舒适度预测与调控中的应用(269)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

树莓派3B小练习

PWM驱动LED灯 3B引脚图 PWM通道 GPIO号 物理引脚 复用功能 PWM0 GPIO12 32 Alt Fun 0 PWM1 GPIO13 33 Alt Fun 0 PWM0 GPIO18 12 Alt Fun 5 PWM1 GPIO19 35 Alt Fun 5 第一步 启用pwm&#xff08;默认情况下未启用&#xff09; 简而言之&#xff0c;你无法通过Linux内核API…

中国信通院:《“机器人+人工智能”工业应用研究报告》| 人工智能赋能机器人,如何重塑工业版图?

在数字经济蓬勃兴起的浪潮中&#xff0c;《中国信通院&苏州机器人产业协会-“机器人人工智能”工业应用研究报告》为我们揭示了智能制造的未来图景。 这份报告不仅是技术发展的记录&#xff0c;更是产业升级的指南。它以深刻的洞察力&#xff0c;剖析了“机器人人工智能”…

LangChain-结合GLM+SQL+函数调用实现数据库查询(三)

针对 LangChain-结合GLM+SQL+函数调用实现数据库查询(二)-CSDN博客 进一步简化 通过 LangChain 和大语言模型(GLM-4)实现了一个 AI 代理,能够根据自然语言提问自动生成 SQL 查询语句,并连接 MySQL 数据库执行查询,最终返回结果。 整个流程如下: 用户提问 → AI 生成 SQ…

8天Python从入门到精通【itheima】-62~63

目录 第六章开始-62节-数据容器入门 1.学习目标 2.为什么要学习数据容器&#xff1f; 3.什么是Python中的数据容器 4.小节总结 63节-列表的定义语法 1.学习目标 2.为什么需要列表&#xff1f; 3.列表定义的基本语法 4.列表定义的基本语法-案例演示 5.列表定义的基本语…

重学计算机网络之以太网

一&#xff1a;历史发展进程 DIX EtherNet V2 战胜IEEE802.3成为主流版本。总线型交换机拓扑机构代替集线器星型拓扑机构 1990年IEEE制定出星形以太网10BASE-T的标准**802.3i**。“10”代表10 Mbit/s 的数据率&#xff0c;BASE表示连接线上的信号是基带信号&#xff0c;T代表…

4、数据标注的武林秘籍:Label-Studio vs CVAT vs Roboflow

开篇痛点&#xff1a;90%的模型效果取决于数据质量 "标注3小时&#xff0c;训练5分钟"——这是很多AI工程师的真实写照。上周有位读者训练YOLOv12时发现&#xff0c;同样的代码&#xff0c;换批数据mAP直接跌了15%&#xff0c;根本原因是标注不规范&#xff01;本文…

一天搞懂深度学习--李宏毅教程笔记

目录 1. Introduction of Deep Learning1.1. Neural Network - A Set of Function1.2. Learning Target - Define the goodness of a function 2. Tips for Training Deep Neural Network3. Variant of Neural Network4. Next Wave 对一天搞懂深度学习–李宏毅教程分享内容做读…

【Canvas与色彩】八彩大风车

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>八彩风车 Draft1</title><style type"text/css"&…

Linux权限

文章目录 一、Linux用户权限1.1权限的概念1.2 用户分类##1.3切换用户1.4sudo提权 二、Linux文件权限2.1文件属性2.2文件的类型2.3 基本权限##2.4权限划分 三、Linux文件权限的修改方法3.1 chmod3.1.1操作符3.1.2数字模式 3.2chown3.3chgrp3.4目录文件权限的具体剖析3.4.1目录的…

70.新增用户内容复制功能

对于AI回答的内容可以复制和重新生成功能&#xff0c;对于用户则没有复制等功能&#xff0c;所以想了一下觉得还是很有必要添加该功能 首先&#xff0c;修改用户消息的模板部分&#xff0c;添加复制按钮&#xff1a; 然后&#xff0c;更新CSS样式以确保按钮正确显示。 因为之前…

暴雨和强对流双预警齐发 多地迎极端天气挑战

中央气象台今日6时继续发布暴雨蓝色预警和强对流天气蓝色预警。福建、广东、广西等六地将有大到暴雨,我国多地将有8级以上雷暴大风或冰雹天气。端午假期最后一天,出行前需关注天气变化。预计6月2日8时至3日8时,福建东部和南部沿海、广东中南部、广西南部、云南西北部和东部、…

Go语言中的rune和byte类型详解

1. rune类型 1.1. 基本概念 1. rune是Go语言的内建类型&#xff0c;它是int32的别名&#xff0c;即32位有符号整数&#xff1b; 2. 用于表示一个Unicode码点&#xff0c;全拼Unicode code point&#xff1b; 3. 可以表示任何UTF-8编码的字符&#xff1b; 1.2. 特点 1. 每…

基于mediapipe深度学习的虚拟画板系统python源码

目录 1.前言 2.算法运行效果图预览 3.算法运行软件版本 4.部分核心程序 5.算法仿真参数 6.算法理论概述 7.参考文献 8.算法完整程序工程 1.前言 虚拟画板系统基于计算机视觉与深度学习技术&#xff0c;通过摄像头捕获用户手部动作&#xff0c;利用 MediaPipe框架实现手…

AUTOSAR图解==>AUTOSAR_SWS_DIODriver

AUTOSAR DIO驱动器详解 基于AUTOSAR 4.4.0规范的DIO驱动架构、配置与应用 目录 1. 引言2. DIO驱动架构 2.1 DIO在AUTOSAR架构中的位置2.2 DIO驱动的功能概述 3. DIO驱动的数据类型和API 3.1 基本数据类型3.2 API接口3.3 错误检测 4. DIO驱动的操作流程 4.1 通道操作4.2 端口操…

Python数据类型详解:从字符串到布尔值,一网打尽

Python是现代编程语言中非常流行的一种&#xff0c;它的语法简洁、易懂&#xff0c;非常适合初学者。而在Python编程中&#xff0c;“数据类型”是最基础也是最重要的概念。理解这个概念&#xff0c;将为你之后的编程打下坚实的基础。 1. 什么是数据类型&#xff1f; 在Pytho…

lc hot 100之:双指针题目对比

写到两个给我感觉很类似的双指针题目&#xff0c;但是代码不同&#xff0c;我想把两个题放在一起&#xff0c;对比着看看。 第一题&#xff1a; 首先&#xff0c;提到“重复”&#xff0c;比较好想到哈希表。访问过就在哈希表里记录&#xff0c;然后只要找哈希表中有没有这个数…

6.01打卡

浙大疏锦行 DAY 40 训练和测试的规范写法 知识点回顾&#xff1a; 1. 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中 2. 展平操作&#xff1a;除第一个维度batchsize外全部展平 3. dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模…

SIM——引入双阶段搜索机制在用户行为序列的同时关注动态兴趣

文章目录 1. 背景2. 方法2.1 GSU2.1.1 Hard Search2.1.2 Soft Search 2.2 ESU 这里来回顾一篇经典的文章 SIM&#xff08;Search-based Interest Model&#xff09;&#xff0c;也是自己学习一下&#xff0c;虽然挺久了&#xff0c;但是业界都在使用这个&#xff0c;说明含金量…