Spring MVC 之 Restful 风格请求⽀持

news2024/11/28 2:47:15

Tips:

  • REST⻛格请求是什么样的?
  • SpringMVC对REST⻛格请求到底提供了怎样的⽀持
    在这里插入图片描述
    在这里插入图片描述
    在 Web 系统中,前端通过 HTTP 请求给后端传递参数有四种方式,可以将参数放在请求路径Query 参数HTTP 协议头HTTP 协议体中。而放在协议体中的参数又有很多格式,比如 jsonform 表单等。当然,前端也可能选择其他协议,比如 WebsocketgRPC-Web 等,具体的参数形式跟 HTTP 又不一样。更多前后端请求和响应参数解析可以看我这篇文章:相关常见的http请求参数和响应参数,前后端交互参数说明。面对这么多种技术实现方式,当我们要设计一套 Web 系统时,该如何选择呢?

文章目录

    • RESTful 解决什么问题?
    • 什么是 RESTful
      • Restful 的优点
      • Restful 的特性
    • RESTful 的示例
    • RESTful 请求规范参考

RESTful 解决什么问题?

首先,我们来看下三个时间点:

  • 1991 年 HTTP 0.9 诞生
  • 1996 年 5 月 HTTP 1.0 诞生
  • 1997 年 1 月 HTTP 1.1 诞生

在 HTTP 1.0 出现以前,也就是 HTTP 0.9 时代,HTTP 协议只支持 GET 请求,所有参数只能通过 URL 传递。比如一个获取动态网页的请求可能是这样的 GET /index.php?pageNum=1&pageSize=10&user=共饮一杯无&action=view
在 HTTP 1.0 出现后,开始有了 POST 请求和 HEAD 请求,支持从 HTTP 协议头和协议体传参数。但 HTTP 1.0 并没有解决每次请求都需要建立新连接的问题,然后 HTTP 1.1 很快就出现了。
HTTP 1.1 除了能保持连接外,还新增了多种方法,如 PUTDELETEPATCHOPTIONS。虽然功能更强大,体验更丰富了,却带来了新的问题:这些方法该如何选择呢?比如我要上传数据,到底是用 POST 、PUT 还是 PATCH 呢?这无疑增加了选择成本。
随后,REST( Representational State Transfer,表现层状态转移) 出现了,简单来说它就是一组架构约束条件和原则,而符合 REST 规则的设计便是 RESTful。
因为 HTTP 协议本身是无状态的,但后端数据是有状态的,如何用无状态的协议来操作有状态的数据就比较有挑战。比如,当只用 GET 请求的时候,你无法从请求参数上直观判断到底是对数据做什么操作,因为大家对 GET 请求参数命名没有统一规范。在前面的例子中,action=view 也有可能被定义成 a=v。
RESTful 是如何解决这个问题的呢?它充分利用了各种 HTTP 请求方法的特点,来表达对数据的具体操作方式。

什么是 RESTful

Restful 是⼀种 web 软件架构⻛格,它不是标准也不是协议,它倡导的是⼀个资源定位及资源操作的⻛格。
什么是 REST
REST(英⽂:Representational State Transfer,简称 REST,表现层状态转换)描述了⼀个架构样式的⽹络系统, ⽐如web 应⽤程序。它⾸次出现在 2000 年 Roy Fielding 的博⼠论⽂中,他是 HTTP 规范的主要编写者之⼀。在⽬前主流的三种 Web 服务交互⽅案中,REST 相⽐于 SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC 更加简单明了,⽆论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于⽤更加简单轻量的⽅法设计和实现。值得注意的是 REST 并没有⼀个明确的标准,⽽更像是⼀种设计的⻛格。
它本身并没有什么实⽤性,其核⼼价值在于如何设计出符合 REST ⻛格的⽹络接⼝。

Restful 的优点

它结构清晰、符合标准、易于理解、扩展⽅便,所以正得到越来越多⽹站的采⽤。

Restful 的特性

资源(Resources):⽹络上的⼀个实体,或者说是⽹络上的⼀个具体信息。
它可以是⼀段⽂本、⼀张图⽚、⼀⾸歌曲、⼀种服务,总之就是⼀个具体的存在。可以⽤⼀个 URI(统⼀资源定位符)指向它,每种资源对应⼀个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此URI 即为每⼀个资源的独⼀⽆⼆的识别符。
表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层 (Representation)。⽐如,⽂本可以⽤ txt 格式表现,也可以⽤ HTML 格式、XML 格式、JSON 格式表现,甚⾄可以采⽤⼆进制格式。
状态转化(State Transfer):每发出⼀个请求,就代表了客户端和服务器的⼀次交互过程。
HTTP 协议,是⼀个⽆状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器, 必须通过某种⼿段,让服务器端发⽣“状态转化”(State Transfer)。⽽这种转化是建⽴在表现层之上的,所以就是 “ 表现层状态转化” 。具体说, 就是 HTTP 协议⾥⾯,四个表示操作⽅式的动词:
GET 、POST 、PUT 、DELETE 。它们分别对应四种基本操作:GET ⽤来获取资源,POST ⽤来新建资
源,PUT ⽤来更新资源DELETE ⽤来删除资源

RESTful 的示例

REST是⼀个url请求的⻛格,基于这种⻛格设计请求的URL。

  • 没有rest的话,原有的url设计:

http://localhost:8080/user/queryUserById.action?id=3
url中定义了动作(操作),参数具体锁定到操作的是谁

  • 有了rest⻛格之后:

rest中,认为互联⽹中的所有东⻄都是资源,既然是资源就会有⼀个唯⼀的uri标识它,代表它http://localhost:8080/user/3 代表的是id为3的那个⽤户记录(资源)
锁定资源之后如何操作它呢?常规操作就是增删改查
根据请求⽅式不同,代表要做不同的操作

  • get 查询,获取资源
  • post 增加,新建资源
  • put 更新
  • delete 删除资源

image.png
REST⻛格带来的直观体现:就是传递参数⽅式的变化,参数可以在uri中了
/account/1 HTTP GET :得到 id = 1 的 account
/account/1 HTTP DELETE:删除 id = 1 的 account
/account/1 HTTP PUT:更新 id = 1 的 account
URL:资源定位符,通过URL地址去定位互联⽹中的资源(抽象的概念,⽐如图⽚、视频、app服务
等)。
RESTful ⻛格 URL:互联⽹所有的事物都是资源,要求URL中只有表示资源的名称,没有动词。
RESTful⻛格资源操作:使⽤HTTP请求中的method⽅法put、delete、post、get来操作资源。分别对应添加、删除、修改、查询。不过⼀般使⽤时还是 post 和 get。put 和 delete⼏乎不使⽤。
RESTful ⻛格资源表述:可以根据需求对URL定位的资源返回不同的表述(也就是返回数据类型,⽐如XML、JSON等数据格式)。
Spring MVC ⽀持 RESTful ⻛格请求,具体讲的就是使⽤ @PathVariable 注解获取 RESTful ⻛格的请求URL中的路径变量。

示例代码

  • 前端jsp⻚⾯
<div>
  <h2>SpringMVC对Restful⻛格url的⽀持</h2>
  <fieldset>
    <p>测试⽤例:SpringMVC对Restful⻛格url的⽀持</p>
    <a href="/demo/handle/15">rest_get测试</a>
    <form method="post" action="/demo/handle">
      <input type="text" name="username"/>
      <input type="submit" value="提交rest_post请求"/>
    </form>
    <form method="post" action="/demo/handle/15/lisi">
      <input type="hidden" name="_method" value="put"/>
      <input type="submit" value="提交rest_put请求"/>
    </form>
    <form method="post" action="/demo/handle/15">
      <input type="hidden" name="_method" value="delete"/>
      <input type="submit" value="提交rest_delete请求"/>
    </form>
  </fieldset>
</div>
  • 后台Handler⽅法
/*
* restful get /demo/handle/15
*/
@RequestMapping(value = "/handle/{id}",method =
                {RequestMethod.GET})
public ModelAndView handleGet(@PathVariable("id") Integer id) {
    Date date = new Date();
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("date",date);
    modelAndView.setViewName("success");
    return modelAndView;
}
/*
* restful post /demo/handle
*/
@RequestMapping(value = "/handle",method = {RequestMethod.POST})
public ModelAndView handlePost(String username) {
    Date date = new Date();
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("date",date);
    modelAndView.setViewName("success");
    return modelAndView;
}
/*
* restful put /demo/handle/15/lisi
*/
@RequestMapping(value = "/handle/{id}/{name}",method =
                {RequestMethod.PUT})
public ModelAndView handlePut(@PathVariable("id") Integer
                              id,@PathVariable("name") String username) {
    Date date = new Date();
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("date",date);
    modelAndView.setViewName("success");
    return modelAndView;
}
/*
* restful delete /demo/handle/15
*/
@RequestMapping(value = "/handle/{id}",method =
                {RequestMethod.DELETE})
public ModelAndView handleDelete(@PathVariable("id") Integer id) {
    Date date = new Date();
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("date",date);
    modelAndView.setViewName("success");
    return modelAndView;
}
  • web.xml中配置请求⽅式过滤器(将特定的post请求转换为put和delete请求)
<!--配置springmvc请求⽅式转换过滤器,会检查请求参数中是否有_method参数,如果有就
按照指定的请求⽅式进⾏转换-->
<filter>
  <filter-name>hiddenHttpMethodFilter</filter-name>
  <filterclass>org.springframework.web.filter.HiddenHttpMethodFilter</filterclass>
</filter>

<filter-mapping>
  <filter-name>encoding</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
  <filter-name>hiddenHttpMethodFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

RESTful 请求规范参考

RESTful 请求规范定义了如何构建和处理 HTTP 请求以实现资源的创建、读取、更新和删除(CRUD)操作。以下是一些常见的 RESTful 请求规范定义:

  1. 使用 HTTP 方法: RESTful 使用 HTTP 方法来执行操作。常见的 HTTP 方法包括 GET(获取资源)、POST(创建资源)、PUT(更新资源)、DELETE(删除资源)等。
  2. 使用 URL 路径表示资源: 资源应该使用 URL 路径来表示,例如:
    • 获取所有用户:GET /users
    • 获取特定用户:GET /users/{id}
    • 创建用户:POST /users
    • 更新用户:PUT /users/{id}
    • 删除用户:DELETE /users/{id}
  3. 使用状态码表示操作结果: 使用 HTTP 状态码来表示操作的结果。常见的状态码包括:
    • 200 OK:成功的 GET 请求。
    • 201 Created:成功的 POST 请求,通常伴随着资源的创建。
    • 204 No Content:成功的 DELETE 请求,没有响应体。
    • 400 Bad Request:请求格式不正确。
    • 401 Unauthorized:未经授权的请求。
    • 404 Not Found:请求的资源不存在。
    • 405 Method Not Allowed:不支持的 HTTP 方法。
    • 500 Internal Server Error:服务器内部错误。
  4. 使用请求头部: 请求头部可以用来传递附加信息,例如身份验证、内容类型等。
  5. 使用请求体: 对于 POST 和 PUT 请求,可以使用请求体(Request Body)来传递数据,通常使用 JSON 或 XML 格式。
  6. 版本控制: 在 API 的设计中,可以使用版本号来标识不同的 API 版本,以确保向后兼容性。
  7. 过滤、排序和分页: 允许客户端通过查询参数来过滤、排序和分页资源。例如:
    • 过滤:GET /users?status=active
    • 排序:GET /users?sort=name
    • 分页:GET /users?page=2&pageSize=10
  8. 错误处理: 在响应中提供详细的错误信息,通常使用 JSON 格式来描述错误,包括错误代码、消息和可选的详细信息。
  9. 安全性: 使用身份验证和授权机制来保护 API 资源,确保只有授权的用户能够执行敏感操作。

这些规范定义了如何设计和使用 RESTful API,以便实现清晰、可维护和可扩展的 API。设计一个良好的 RESTful API 对于构建可靠的分布式应用程序至关重要。

本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位指出。
主页:共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃

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

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

相关文章

五,修改.hdr插件

由于辐照度贴图是.hdr格式&#xff0c; glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_FLOAT, data); osg的.hdr插件需要修改&#xff0c;否则格式不对。 即在ReaderWriterHDR::readImage()中修改&#xff0c; bool convertToRGB8 true;int pixel…

【iOS逆向与安全】DTRpcClient 抓包和代码分析记录

frida-trace -UF -m "-[DTRpcConfig isAMRPC]"onEnter(log, args, state) {log(-[DTRpcConfig isAMRPC] ~~~~~);var customObj new ObjC.Object(args[0]); // 自定义对象// 打印该对象所有属性var ivarList customObj.$ivars;for (key in ivarList) {log(key${key…

【SpringBoot】| SpringBoot集成Dubbo

目录 一&#xff1a;SpringBoot集成Dubbo 1. 创建公共项目 2. 创建提供者项目provider 3. 创建消费者consumer项目 4. 注册中心Zookeeper的安装 图书推荐&#xff1a;《Python 自动化办公应用大全》 一&#xff1a;SpringBoot集成Dubbo 阿里巴巴提供了 dubbo 集成 spring…

原来,这就是现货黄金投资最大的悲哀

在现货黄金投资之中&#xff0c;最大的悲哀是什么呢&#xff1f;首先要知道的是现货黄金投资中最大的悲哀并不是亏损&#xff0c;比如投资者会问我都亏损了&#xff0c;为什么不是最大的悲&#xff1f;哎&#xff0c;不就是因为想进行现货黄金投资&#xff0c;就是想获利的吗&a…

北斗导航系统为渔船保驾护航,助力海洋渔业发展

在无垠的海洋中&#xff0c;渔船扮演着举足轻重的角色&#xff0c;为人们带来美味的海鲜。然而&#xff0c;每一次渔船出海都充满了未知和危险&#xff0c;船只的安全成为了渔民和国家关注的焦点。幸运的是&#xff0c;北斗导航系统作为一项顶级技术正在为渔船保驾护航&#xf…

肖sir___环境的讲解详情__002

一、环境讲解 1、jdk 什么是JDK&#xff1f;JDK的作用&#xff1f; JDK是java语言的软件开发工具包&#xff0c;能解释java程序&#xff0c;编译java语言&#xff0c;没有jdk的话无法编译Java程序。 包含了各种类库和工具&#xff0c;机器不是直接识别语言的&#xff0c;会借助…

零信任沙盒

零信任沙盒分析对比 互联网早期的沙盒&#xff08;sandbox&#xff09;又译为沙箱&#xff0c;意为在计算机安全领域中构建一种安全机制&#xff0c;为运行中的程序提供的隔离环境。通常用来测试一些来源不可信、具破坏力或无法判定的程序&#xff0c;特别是病毒木马类的程序。…

塔望食研院|千亿食用油市场拐点,量减价增,竞争加剧!

自2022年12月塔望咨询开设塔望食品大健康消费研究院&#xff08;简称塔望食研院&#xff09;栏目以来&#xff0c;塔望食研院以“为食品行业品牌高质量发展赋能”为理念&#xff0c;不断发布食品大健康行业研究、消费研究报告。塔望食研院致力于结合消费调研数据、企业数据、第…

XC8233 电容式单按键触摸检测 IC 广泛应用于 TWS及 DC 应用上,实现产品智能化

目前市面上很多的小家电和消费类电子都已经改成触摸式的按键功能&#xff0c;而XC8233是一款电容式单按键触摸检测及接近感应控制芯片。采用 CMOS 工艺制造&#xff0c;内建稳压和去抖动电路&#xff0c;高可靠性&#xff0c;专为取代传统按键开关而设计。超低功耗与宽工作电压…

Java笔记:手写spring之简单实现springboot

手写spring之简单实现springboot 仓库地址: Raray-chuan/mini-spring 博文列表: 导读手写spring之ioc手写spring之aop手写spring之简单实现springboot 1.springmvc框架的理解 什么是MVC: MVC就是一个分层架构模式: MVC 设计模式一般指 MVC 框架&#xff0c;M&#xff08…

ALM物联网管理平台助力中台上云 数字化转型让展示更直观清晰

支持移动浏览、支持大屏显示等功能&#xff0c;能够为设备厂家提供数据依据&#xff0c;方便厂家的售后以及产品的维护、为运维等相关公司提供运维管理等相关功能。 ALM物联网云平台是基于以往的物联网产品&#xff0c;以及目前市场上的各种云平台优点&#xff0c;研精心打造的…

车联网安全集智联盟正式成立

2023年9月22日&#xff0c;在工业和信息化部网络安全管理局支持下&#xff0c;2023年世界智能网联汽车大会——“集智创新车联网安全新格局”特色专场在北京举行。工业和信息化部网络安全管理局领导出席并致辞&#xff0c;中国工程院邬江兴院士以及来自政产学研用等各方的领导和…

TLS/SSL(一)科普之加密、签名和SSL握手

一 背景知识 感悟&#xff1a; 不能高不成低不就备注&#xff1a; 以下内容没有逻辑排版,仅做记录 https基础面经 ① 加密方式 说明&#xff1a; 单向和双向认证遗留&#xff1a; 如何用openssl从私钥中提取公钥? ② 互联网数据安全可靠条件 说明&#xff1a; 二者相…

Java核心-你真的知道Object吗(Object:所有类的超类)

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; 前言 今天来聊一聊…

医院陪诊小程序源码 陪诊陪护小程序源码

医院陪诊小程序源码 陪诊陪护小程序源码 近年来&#xff0c;随着互联网技术的不断发展&#xff0c;我们的生活中出现了越来越多的智能设备和智能应用&#xff0c;这些智能应用不仅极大方便了我们的生活&#xff0c;还对现代医疗服务体验产生了深远的影响。本文将为大家介绍一种…

轻松搭建Linux的环境

Linux的环境的搭建 目录&#xff1a;一、使用云服务器二、使用虚拟机软件2.1 下载虚拟机软件2.2 下载一个操作系统的镜像文件 三、直接安装在物理机上四、使用XShell远程登录到Linux 目录&#xff1a; 我们平常用的都是windows系统&#xff0c;对Linux系统还是很陌生得。为什么…

【软件测试】资深测试聊,自动化测试分层实践,彻底打通高阶...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试的分层…

软件调研、研发、设计、管理、验收文档(全文档整理)

前言&#xff1a; 在软件开发生命周期中&#xff0c;调研、研发、设计、管理、验收等环节的文档编写至关重要。它们分别扮演着不同的角色&#xff0c;为项目的顺利进行和最终的成功提供支持和保障。 【获取方式在文末】 【在调研阶段】&#xff0c;文档的主要作用是记录和整…

Java环形链表(图文详解)

目录 一、判断链表中是否有环 &#xff08;1&#xff09;题目描述 &#xff08;2&#xff09;题解 二、环形链表的入环节点 &#xff08;1&#xff09;题目描述 &#xff08;2&#xff09;题解 一、判断链表中是否有环 &#xff08;1&#xff09;题目描述 给你一个链表的…

OCX 添加方法和事件 HTML调用ocx函数及回调 ocx又调用dll VS2017

ocx添加方法 类视图 最后面的XXXXXlib 右键 添加 添加方法。 其它默认 添加事件 类视图 最后面的XXXXX 右键 添加 添加事件。 这样编译就ocx可以了。 #include <iostream> #include <string> #include <comutil.h>CMFCActiveXControlSmartPosCtrl* …