restful风格快速入门

news2025/1/23 7:00:07

restful风格入门

概述

简介:REST(Representational State Transfer),表现形式状态转换。

  • 传统风格
    http://localhost/users/getById?id=1
    http://localhost/users/saveUser

  • REST风格
    http://localhost/users/1
    http://localhost/users

对比
对比可以发现,虽然传统风格的更详细,知道调用哪个函数,但是了太长了写起来不方便,REST风格的话就很简介,而且还可以隐藏函数调用的函数的名字,无法通过地址得知对资源进行何种操作,更加安全。

如何区分资源访问形式
在后面的代码演示的时候就会知道,REST风格定义了很多种类的Mapping注解,通过这些注解进行识别。

  • http://localhost/users 查询全部用户信息 GET(查询)
  • http://localhost/users/1 查询指定用户信息 GET(查询)
  • http://localhost/users 添加用户信息 POST(添加/保存)
  • http://localhost/users 修改用户信息 PUT(修改/更新)
  • http://localhost/users 删除用户信息 DELETE(删除)

规范
REST风格更多的是一种规范,对于描述模块名称通常使用复数,比如users

快速入门

文件结构

在这里插入图片描述
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>SpringBootRestful</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBootRestful</name>
    <description>SpringBootRestful</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

User

package com.example.springbootrestful.bean;

public class User {
    private Integer id;
}

Controller

传统代码

package com.example.springbootrestful.controller;

import com.example.springbootrestful.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {
    // save与update需要的是post方法才可以访问
    @RequestMapping("/save")
    @ResponseBody
    public String save(@RequestBody User user){
        System.out.println("user save..." + user);
        return "{'module':'user save'}";
    }

    @RequestMapping("/delete")
    @ResponseBody
    public String delete(Integer id){
        System.out.println("user delete..." + id);
        return "{'module':'user delete'}";
    }

    @RequestMapping("/update")
    @ResponseBody
    public String update(@RequestBody User user){
        System.out.println("user update..." + user);
        return "{'module':'update save'}";
    }

    @RequestMapping("/getById")
    @ResponseBody
    public String getById(Integer id){
        System.out.println("user getById..." + id);
        return "{'module':'user getById'}";
    }

    @RequestMapping("/getAll")
    @ResponseBody
    public String getAll(){
        System.out.println("user getAll...");
        return "{'module':'user getAll'}";
    }
}

运行演示
在这里插入图片描述
在这里插入图片描述

RESTful风格代码

package com.example.springbootrestful.controller;

import com.example.springbootrestful.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
public class UserController {
    // save与update需要的是post方法才可以访问
    @RequestMapping(value = "/users",method = RequestMethod.POST)
    @ResponseBody
    public String save(@RequestBody User user){
        System.out.println("user save..." + user);
        return "{'module':'user save'}";
    }

    @RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(@PathVariable Integer id){
        System.out.println("user delete..." + id);
        return "{'module':'user delete'}";
    }

    @RequestMapping(value = "/users",method = RequestMethod.PUT)
    @ResponseBody
    public String update(@RequestBody User user){
        System.out.println("user update..." + user);
        return "{'module':'update save'}";
    }

    @RequestMapping(value = "/users/{id}",method = RequestMethod.GET)
    @ResponseBody
    public String getById(@PathVariable Integer id){
        System.out.println("user getById..." + id);
        return "{'module':'user getById'}";
    }

    @RequestMapping(value = "/users",method = RequestMethod.GET)
    @ResponseBody
    public String getAll(){
        System.out.println("user getAll...");
        return "{'module':'user getAll'}";
    }
}

完善

package com.example.springbootrestful.controller;

import com.example.springbootrestful.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/Users")
public class UserController {
    // save与update需要的是post方法才可以访问
    @PostMapping
    public String save(@RequestBody User user){
        System.out.println("user save..." + user);
        return "{'module':'user save'}";
    }

    @DeleteMapping
    public String delete(@PathVariable Integer id){
        System.out.println("user delete..." + id);
        return "{'module':'user delete'}";
    }

    @PutMapping
    public String update(@RequestBody User user){
        System.out.println("user update..." + user);
        return "{'module':'update save'}";
    }

    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("user getById..." + id);
        return "{'module':'user getById'}";
    }

    @GetMapping
    public String getAll(){
        System.out.println("user getAll...");
        return "{'module':'user getAll'}";
    }
}

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

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

相关文章

spring-boot sentry 不触发事件

按照官网的提示https://docs.sentry.io/platforms/java/guides/spring-boot/performance/ 一步一步的确认&#xff0c;但是最终就是不触发事件 解决过程&#xff1a; 1.开启debug 在properties文件增加一行 sentry.debugtrue2.运行&#xff0c;查看日志输出。 dsn什么的配…

Android代码保护与反调试方案

1、代码保护方案 1.1、Proguard代码混淆 ProGuard是一个开源的Java代码收缩器&#xff0c;优化器&#xff0c;混淆器和预校验器&#xff0c;ProGuard的作用如下&#xff1a; &#xff08;1&#xff09;压缩(Shrink):检查并移除代码中无用的类、字段、方法&#xff1b; &#…

一键回复聊天软件

不论是何种行业&#xff0c;高效工作都是企业一直在追求的&#xff0c;如果在为客户提供服务的过程中&#xff0c;有一个趁手的好工具是可以带来事半功倍的效果的。 前言 随着互联网的发展&#xff0c;越来越多的工作开始转向线上化&#xff0c;通过网络可以满足客户的多种需求…

手写Srping10(实现容器事件监听)

文章目录目标设计项目结构一、实现1、定义事件接口--ApplicationEvent1、定义通用应用上下文事件--ApplicationContextEvent2、定义刷新和关闭事件--ContextClosedEvent、ContextRefreshedEvent2、定义事件监听--ApplicationListener3、定义事件广播器--ApplicationEventMultic…

audio_open函数分析

audio_open() 的作用&#xff0c;就如同它的名字那样&#xff0c;就是打开音频设备。流程图如下&#xff1a; SDL 库播放音频数据有两种方式。 1&#xff0c;调用层定时往 SDL 接口塞数据。 2&#xff0c;设置SDL回调函数&#xff0c;让 SDL 来主动执行回调函数来取数据。 第…

ABAP 字符处理

场景1:是否只包含数字 str1 CO 0123456789 涉及关键字&#xff1a;CO&#xff0c;使用公式 str1 CO str2 。表示 str1 中 的每个字符 在 str2 中都能找到 类比&#xff1a;无 场景2&#xff1a;字符串1 是否 包含 字符串2 DATA str1 TYPE STRING VALUE hello world. DATA …

Pytest测试框架搭建需求及实现方案

目录 框架需求及实现方案 框架需求 实现方案 支持接口自动化、Web UI自动化及App自动化 可以批量运行用例并生成测试报告 测试完成发送邮件 提供灵活的运行方式&#xff0c;如按功能模块运行、按脚本运行、按用例等级运行等等 提供运行日志方便定位问题 支持切换环境 …

李沐精读论文:MAE 《Masked Autoencoders Are Scalable Vision Learners》

论文&#xff1a;Masked Autoencoders Are Scalable Vision Learners 别再无聊地吹捧了&#xff0c;一起来动手实现 MAE(Masked Autoencoders Are Scalable Vision Learners) 玩玩吧&#xff01; - 知乎 参考博文&#xff1a;MAE 论文逐段精读【论文精读】 - 哔哩哔哩 神洛华…

QT 学习笔记(十)

文章目录一、绘图1. 理论知识储备2. 画背景图3. 简单绘图4. 手动刷新窗口二、绘图实现代码1. 主窗口头文件 widget.h2. 主窗口头文件 widget.cpp由于每次代码都是在原有程序上修改&#xff0c;因此除了新建项目&#xff0c;不然一般会在学完后统一展示代码。 提示&#xff1a;具…

【Python机器学习】卷积神经网络卷积层、池化层、Flatten层、批标准化层的讲解(图文解释)

卷积神经网络 卷积神经网络&#xff08;convolutional neural network, CNN&#xff09;在提出之初被成功应用于手写字符图像识别&#xff0c;2012年的AlexNet网络在图像分类任务中取得成功&#xff0c;此后&#xff0c;卷积神经网络发展迅速&#xff0c;现在已经被广泛应用于…

怎样在Odoo 16中启用完整的财务功能

Odoo是目前市场上最好的ERP软件之一。Odoo提供两种类型的版本&#xff0c;社区版和企业版。Odoo社区版是由开源软件支持的免费基本版。Odoo社区版本中没有一些模块和功能。但企业版付费版&#xff0c;升级版更适合更高的价值。Odoo企业版具有无限的功能支持和完整的功能。性能和…

「集合底层」深入浅出HashMap底层源码

「集合底层」深入浅出HashMap底层源码 一、HashMap介绍 HashMap底层采用了哈希表&#xff0c;而哈希表是由数组和链表实现的。数组和链表各有自己的特点&#xff1a; 数组&#xff1a;占用空间连续。 寻址容易&#xff0c;查询速度快。但是&#xff0c;增加和删除效率非常低…

倒序打印链表

在做这个题的时候我闹了一个大笑话&#xff0c;我用了反转链表做&#xff0c;哈哈哈哈&#xff0c; 这个题目思路很简单&#xff0c;用到了数组的头插法&#xff0c;注意题目要求返回数组 遍历链表&#xff0c;将链表的val放到数组中 下面来看代码 import java.util.ArrayLis…

flash基础知识

flash基础手册一、flash概念&#xff08;一&#xff09;特性&#xff08;二&#xff09;FLASH的块/扇区/页关系&#xff08;三&#xff09;常用FLASH型号大小&#xff08;四&#xff09;常用FLASH擦写规则&#xff08;五&#xff09;存储器类型参考二、与其他类型存储器件对照&…

PDF文件怎么加密?推荐3种方法给你

在我们的工作学习上&#xff0c;应该有不少人都需要使用到PDF文件格式&#xff0c;毕竟这个格式它兼容性较广&#xff0c;且不易编辑&#xff0c;能较好的保存文件。不过&#xff0c;我们有时为了不让它被其它人随意查看&#xff0c;会给这个文件进行加密的操作。那你们知道如何…

python实现基于TNDADATASET的人体行为识别

首先来看下TNDADATASET&#xff1a; 随便打开一个文件简单看下如下所示&#xff1a; 可以大概推测出来&#xff0c;这里面不同维度的数据集应该是由不同的穿戴式传感器采集得到的&#xff0c;最后一列的class表示的是当前的行为类型。 在我之前的博文里面已经做过了相关的工作…

计算机毕设Python+Vue养老机构管理信息系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Sigrity常见问题解决方法(持续更新)

Sigrity常见问题解决方法&#xff08;持续更新&#xff09; 1.使用SpeedEM仿真时&#xff0c;报placement error 错误信息如下&#xff1a; 该问题是因为Mesh设置的过大&#xff0c;导致via和note在同一个mesh网格上存在粘连 解决方法是&#xff1a;将mesh进行auto设置 2…

鲍鱼年龄预测 knn svm 逻辑回归

数据&#xff1a; M,0.455,0.365,0.095,0.514,0.2245,0.101,0.15,15 M,0.35,0.265,0.09,0.2255,0.0995,0.0485,0.07,7 F,0.53,0.42,0.135,0.677,0.2565,0.1415,0.21,9 M,0.44,0.365,0.125,0.516,0.2155,0.114,0.155,10 I,0.33,0.255,0.08,0.205,0.0895,0.0395,0.055,7 I,0.425…

基于pytorch搭建CNN 人像口罩识别检测项目

项目介绍 我们将使用 CNN (卷积神经网络)和机器学习分类器创建一个检测一个人是否戴着口罩的分类器。它将检测一个人是否戴着口罩。 我们将从头开始学习,我将对每一步进行解释。我需要你对机器学习和数据科学有基本的了解。我已经在本地 Windows 10 机器上实现了它,如果你…