Rest 优雅的url请求处理风格及注意事项

news2024/10/2 14:24:39

😀前言
本篇博文是关于Rest 风格请求的应用和注意事项,希望能够帮助到您😊

🏠个人主页:晨犀主页
🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在此感谢啦😊

文章目录

  • Rest 风格请求处理
    • 基本介绍
    • SpringBoot Rest 风格应用实例
      • 应用实例
    • Rest 风格请求-注意事项和细节
        • 注意
        • 小细节:思考
        • 解读:
    • 😄总结

Rest 风格请求处理

基本介绍

在这里插入图片描述

REST:即Representational State Transfer。(资源)表现层状态转化。是目前流行的请求方式。它结构清晰, 很多网站采用

  1. Rest 风格支持(使用HTTP 请求方式动词来表示对资源的操作)
  2. 举例说明:
    ● 请求方式: /monster
    ● GET-获取怪物
    ● DELETE-删除怪物
    ● PUT-修改怪物
    ● POST-保存妖怪

SpringBoot Rest 风格应用实例

需求: 演示SpringBoot 中如何实现Rest 风格的增删改查

image-20230811143826801

应用实例

1.创建com/nlc/web/controller/MonsterController.java

@RestController
//@Controller
public class MonsterController {

    //等价的写法
    //@RequestMapping(value = "/monster",method = RequestMethod.GET)
    @GetMapping("/monster")
    public String getMonster() {
        return "GET-查询妖怪";
    }

    //等价写法
    //@RequestMapping(value = "/monster", method = RequestMethod.POST)
    @PostMapping("/monster")
    public String saveMonster() {
        return "POST-添加妖怪";
    }

    //等价写法
    //@RequestMapping(value = "/monster",method = RequestMethod.PUT)
    @PutMapping("/monster")
    public String putMonster() {
        return "PUT-修改妖怪~~";
    }

    //等价写法
    //@RequestMapping(value = "/monster", method = RequestMethod.DELETE)
    @DeleteMapping("/monster")
    public String delMonster() {
        return "DELETE-删除妖怪";
    }

}
  1. 使用Postman 完成测试, 请求url: http://localhost:8080/monster

image-20230811144036629

Rest 风格请求-注意事项和细节

1、客户端是PostMan 可以直接发送Put、delete 等方式请求,可不设置Filter
2、如果要SpringBoot 支持页面表单的Rest 功能, 则需要注意如下细节

注意

  1. Rest 风格请求核心Filter :HiddenHttpMethodFilter:浏览器form 表单只支持GET 与POST 请求,而DELETE、PUT等method 并不支持,Spring 添加了一个过滤器,可以将这些请求转换为标准的http 方法,使得支持GET、POST、PUT 与DELETE 请求。
  2. 、HiddenHttpMethodFilter 在将post 转成delete / put 请求时,是按_method 参数名来读取的。
  3. 表单请求会被HiddenHttpMethodFilter 拦截, 获取到表单_method 的值, 再判断是PUT/DELETE/PATCH(注释: PATCH 方法是新引入的,是对PUT 方法的补充,用来对已知资源进行局部更新:https://segmentfault.com/q/1010000005685904)。
  4. 如果要SpringBoot 支持页面表单的Rest 功能, 需要在application.yml 启用filter 功能,否则无效。
  5. 修改application.yml 启用filter 功能。
spring:
  mvc:
    static-path-pattern: /res/** #修改静态资源访问的路径/前缀
    hiddenmethod:
      filter:
        enabled: true #启用了HiddenHttpMethodFilter,开启页面表单的Rest功能
  web:
    resources:
      #修改/指定 静态资源的访问路径/位置
      static-locations: ["classpath:/img/","classpath:/META-INF/resources/",
                         "classpath:/resources/", "classpath:/static/", "classpath:/public/"]
                         #String[] staticLocations
  1. 修改对应的页面, 自己测试即可.
  • 创建src\main\resources\public\rest.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>rest</title>
</head>
<body>
<h1>测试rest风格的url, 来完成请求.</h1>
<form action="/monster" method="post">
    u: <input type="text" name="name"><br/>
    <!--    通过隐藏域传递_method 参数指定值-->
    <!--如果要测试delete, put , 就打开下面的注释-->
	<!-- <input type="hidden" name="_method" value="delete">-->
    <input type="submit" value="点击提交">
</form>
</body>
</html>
  1. 完成测试, 注意url 是localhost:8080/res/rest.html, 如果希望url 是localhost:8080/rest.html, 将application.yml 文件的static-path-pattern: /res/** 注销即可

image-20230811163618503

image-20230811164100098

小细节:思考

为什么这里return “GET-查询妖怪”, 返回的是字符串, 而不是转发到对应的资源文件?

解读:

因为@ResController 是一个复合注解, 含有@ResponseBody, 所以springboot 底层(springmvc), 在处理return “xxx” 时, 会以@ResponseBody 注解进行解析处理, 即返回字符串"xxx", 而不会使用视图解析器来处理。
我们可以试一下, 如果我们把@RestController 改成@Controller , 当你访问getMonster() 时, 如果你有xxx.html就会转发到xxx.html , 如果没有xxx.html , 就会报404。
提示: 在测试时, 将xxx.html 放在main\resources\public\xxx.html 进行测试, 并在application.yml 配置视图解析器

@GetMapping("/monster")
public String getMonster() {
	return "GET-查询妖怪";
}

—在application.yml 配置解析器-----

spring:
 mvc:
  view:
   suffix: .html   #后缀
   prefix: /    #前缀

—提示: 测试完后, 把代码恢复原状-----

使用Postman 进行测试, 可能出现的问题和解决方案分析.

image-20230811165122138

如何解决

spring:
  mvc:
#    static-path-pattern: /res/** #修改静态资源访问的路径/前缀
    hiddenmethod:
      filter:
        enabled: true #启用了HiddenHttpMethodFilter,开启页面表单的Rest功能
    view:       #配置视图解析器
      suffix: .html
      prefix: /        #这里是需要注意 prefix需要和当前的static-path-pattern一致。如果不一致就无法访问到静态资源

😄总结

  1. 不含有@ResponseBody时, springboot 底层(springmvc) 在处理return “xxx” 时是有顺序的。
  2. 如果配置了视图解析器,就按照视图解析器来定位;如果没有配置视图解析器,就看controller有没有/xxx
  3. HiddenHttpMethodFilter 在将post 转成delete / put 请求时,是按_method 参数名来读取的。

😁热门专栏推荐
SpringBoot篇
SpringBoot容器–注解的使用
以数据为中心的标记语言–yaml
SpringBoot 自动配置–常用配置
Spring Boot介绍–快速入门–约定优于配置
安装Lombok–Lombok的常用注解说明及使用方法
SpringBoot 依赖管理和自动配置—带你了解什么是版本仲裁

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

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

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

相关文章

DC-DC拓扑

任何电子产品都离不开电源的设计&#xff0c;其中DCDC是使用频率最高的。 DCDC共分三种&#xff0c;降压电路&#xff0c;升压电路&#xff0c;升降压电路,常用的是前两种。 BUCK: 此拓扑结构几乎是所有DCDC降压电路的模型 原理分析&#xff1a; 1、开关管导通时&#xff0…

湘大 XTU OJ 1256 湘潭大学 题解(非常详细):枚举

一、链接 1256 湘潭大学 二、题目 题目描述 湘潭大学简称“XTU”&#xff0c;作为即将成为湘大的一份子&#xff0c;怎么不能为湘大添砖加瓦了&#xff1f;现在给你一个字符串&#xff0c;请你计算一下&#xff0c;从中选取字符&#xff0c;最多能组成多少个“XTU”&#x…

手动实现 Spring 底层机制 实现任务阶段一编写自己 Spring 容器-准备篇【2】

&#x1f600;前言 手动实现 Spring 底层机制的第2篇 实现了任务阶段一编写自己 Spring 容器-准备篇【2】 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的…

【2023 华数杯全国大学生数学建模竞赛】 B题 不透明制品最优配色方案设计 39页论文及python代码

【2023 华数杯全国大学生数学建模竞赛】 B题 不透明制品最优配色方案设计 39页论文及python代码 1 题目 B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此&#xff0c;不透明制品的配色对其外观美观度和市场竞争力起着重要作用。…

小白进行桌面端程序自动化测试

步骤 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Ta…

Vue 3.0中的Treeshaking?

1.treeshaking是什么&#xff1f; Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术&#xff0c;专业术语叫 Dead code elimination 简单来讲&#xff0c;就是在保持代码运行结果不变的前提下&#xff0c;去除无用的代码 如果把代码打包比作制作蛋糕&#…

视觉学习(七)---Flask 框架下接口调用及python requests 实现json字符串传输

在项目实施过程中需要与其他系统进行接口联调&#xff0c;将图像检测的结果传递给其他系统接口&#xff0c;进行逻辑调用。这中间的过程可以通过requests库进行实现。 1.安装requests库 pip install requests2.postman 接口测试 我们先通过postman 了解下接口调用&#xff0…

指针的一些笔试题

一&#xff1a; 二&#xff1a; 三&#xff1a; 四&#xff1a; 五&#xff1a; 六 七 八&#xff0c;printf对指针的 --操作是会改变pcc的&#xff0c;要继承&#xff0c;而单纯的数子&#xff0c;是不会改变原有位置的

酒吧座位全解析 小白必看

相信还有很多第一次去酒吧的朋友们还不了解吧台、散台、卡座的区分&#xff0c;下面我简单解说一下&#xff0c;如有错漏&#xff0c;欢迎指正&#xff01;一、吧台吧台是酒吧的核心部位&#xff0c;走进酒吧门&#xff0c;首先映入眼帘的就是吧台&#xff0c;一排人围着吧台几…

Qt 7. 在自定义类TcpClient类中使用信号槽功能

1. 因为只有QObject类及其子类派生的类才能使用信号和槽机制。 使用信号和槽还必须在类声明的最开始处添加Q_OBJECT宏&#xff0c;在这个程序中&#xff0c;类的声明是自动生成的&#xff0c;已经添加了这个宏。UI类继承自QDialog&#xff0c;QDialog类又继承自QWidget类&…

【果树农药喷洒机器人】Part7:果树对靶变量喷药实验

文章目录 一、引言二、果树对靶变量喷药实验2.1实验准备2.2实验步骤2.3实验结果与分析总结 一、引言 对靶不变量喷药指视觉系统识别出树冠后对其喷药&#xff0c;而不将树冠间隙作为喷施对象&#xff0c;为间歇性喷药模式&#xff0c;有别于连续喷药对非靶标和靶标均进行的无差…

绝了!学编程的还有不知道的吗?这个Java开发工具免费了!

智能开发正在迅速走红&#xff01; 随着ChatGPT的广泛应用&#xff0c;智能开发越来越受到关注。然而&#xff0c;实际上&#xff0c;在数年前开始尝试智能开发的探索。 自从2014年ForresterResearch提出"低代码"的概念以来&#xff0c;低代码平台的发展非常迅速。…

Nginx之lnmp架构

目录 一.什么是LNMP二.LNMP环境搭建1.Nginx的搭建2.安装php3.安装数据库4.测试Nginx与PHP的连接5.测试PHP连接数据库 一.什么是LNMP LNMP是一套技术的组合&#xff0c;Llinux&#xff0c;Nnginx&#xff0c;Mmysql&#xff0c;Pphp 首先Nginx服务是不能处理动态资源请求&…

2.物联网LWIP网络

一。创建工程 1.Cubemx创建工程 &#xff08;1&#xff09;操作系统的时钟配置 &#xff08;2&#xff09;配置ETH 注意&#xff1a;根据底板原理图&#xff0c;不是核心板原理图 &#xff08;3&#xff09;配置USART1串口&#xff0c;配置为异步通信 注意&#xff1a;配置结…

一篇文章带你实现栈的接口

一&#xff0c;什么是栈 栈&#xff08;Stacks&#xff09;是限定在一端插入和删除的线性表。允许插入和删除的一端称为栈顶&#xff08;Top&#xff09;&#xff0c;另一端称为栈底&#xff08;Bottom&#xff09;。栈中的数据元素遵守后进先出&#xff08;Last In First Out…

Mysql索引篇——Day01

Mysql索引篇——Day01 什么是索引&#xff1f;索引的分类按数据结构分按物理存储分按字段特性分类按字段个数分类 什么时候需要创建索引/不需要创建索引&#xff1f;优化索引的方法前缀索引优化覆盖索引优化主键索引最好是自增的索引最好设置为 NOT NULL防止索引失效 什么是索引…

Java基础入门篇——Java Number Math 类

当我们在Java中处理数字和执行数学计算时&#xff0c;可以使用Java的Number和Math类。这两个类提供了一系列方法和常量&#xff0c;用于处理和操作数字数据。 1、Number类&#xff1a; Number是一个抽象类&#xff0c;是Java中所有数字类的父类&#xff0c;包括Byte、Short…

设计模式(6)原型模式

一、介绍 Java中自带的原型模式是clone()方法。该方法是Object的方法&#xff0c;native类型。他的作用就是将对象的在内存的那一块内存数据一字不差地再复制一个。我们写简单类的时候只需要实现Cloneable接口&#xff0c;然后调用Object::clone方法就可实现克隆功能。这样实现…

1.物联网IWIP网络

一。以太网 1.nc模拟UDP &#xff08;1&#xff09;COMMBOX通信调试工具 &#xff08;2&#xff09; 控制台输入nc -u 127.0.0.1 8000,此时串口也可以获得数据 &#xff08;3&#xff09;串口调试程序发送字符串&#xff0c;电脑控制台也会展示同样字符串&#xff08;说明UDP…

java文件

一.File类 二.扫描指定目录&#xff0c;并找到名称中包含指定字符的所有普通文件&#xff08;不包含目录&#xff09;&#xff0c;并且后续询问用户是否要删除该文件 我的代码: import java.io.File; import java.io.IOException; import java.util.Scanner;public class Tes…