一文了解什么是RESTful风格

本文已收录于专栏 《Java》


目录

背景介绍

在没有使用RESTful风格之前,都是使用传统的Web应用开发的,通常会使用服务器端的脚本语言(如PHP、Java、Python等)来处理用户请求,生成动态的HTML页面,以及与数据库进行交互。控制器负责接收用户的请求,处理业务逻辑,并将结果传递给视图进行展示。视图负责将数据呈现给用户,通常是通过生成HTML页面来展示内容。

在这种传统的Web应用中,前端页面和后端业务逻辑通常混合在一起,前端页面直接与后端服务端进行交互,而且页面的展示和数据处理都由服务器端负责。

在这种传统的Web应用中,前端页面通常由服务器动态生成,并且包含大量的后端业务逻辑。前端页面与后端之间的交互通常通过表单提交、页面重载等方式实现,而前端页面的展示和用户交互逻辑也由后端服务器端负责处理。

传统的Web应用(前后端未分离)在开发、维护、扩展和性能等方面存在一些问题,而采用前后端分离的架构可以一定程度上解决这些问题,提高系统的灵活性、可维护性和性能。所以引入了RESTful风格。

概念说明

RESTful风格是一种软件架构风格,它是一种设计网络应用程序的方式,可以使系统更加简单、灵活、可扩展和易于维护。RESTful是Representational State Transfer的缩写,它强调使用标准的HTTP方法(如GET、POST、PUT、DELETE)来对资源进行操作,通过URL来定位资源,并使用状态码来表示操作结果。

重点!!!它仅仅是一种风格!!

设计特点

  1. 基于资源:将系统中的各种数据和功能抽象为资源,通过URL来表示资源的位置,并使用HTTP方法对资源进行操作。
  2. 状态转移:客户端和服务器之间的交互是无状态的,每次请求都包含足够的信息来完成请求处理,服务器不需要保存客户端的状态信息。
  3. 统一接口:使用统一的接口(如HTTP方法和URL)来对资源进行操作,使得不同的系统可以通过相同的方式进行交互。
  4. 无状态:服务器不保存客户端的状态信息,客户端每次请求都需要包含足够的信息来完成请求处理。

代码说明

通过使用spring mvc中的注解可以更方便的实现Restful风格的API设计。比如可以使用@GetMapping、@PostMapping、@PutMapping、@DeleteMapping等注解来指定不同的HTTP方法,使用@RequestMapping注解来指定URL路径,从而实现Restful风格的API设计。通过合理使用RequestMapping注解,可以使代码更加清晰和易于维护。

@RequestMapping

此注解作用于方法上,用来设置当前控制器方法请求访问路径。value属性用来设置请求访问路径,method属性用来设置情况的类型。

java 复制代码
    @ApiOperation("创建班级")
    @RequestMapping(value="createClasses",method= RequestMethod.POST)
    @Transactional(rollbackFor = Exception.class)
    public Boolean createClasses(@RequestBody Classes classes){

        if(classesManage.checkClassesInfo(classes)) {
            classesManage.setClasses(classes);
            classesDao.save(classes);
            return true;
        }
        return false;
    }

@RestController

此注解作用于类上,用来设置当前控制器类为RESTful风格,等同于 @Controller 与 @ResponseBody两个注解的组合功能。

java 复制代码
@RestController
@RequestMapping("/xxxxx")
public class ClassesController {

}

@GetMapping、@PostMapping、@PutMapping、@DeleteMapping

此注解作用于方法上,用来设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作。

java 复制代码
    @ApiOperation("新增课表")
    @PostMapping("/insertCurriculum")
    public Curriculum insertCurriculum(@RequestBody Curriculum curriculum) {
        Curriculum curriculumResult = curriculumDao.save(curriculum);

        // 清除
        entityManager.clear();
        Curriculum curriculumObject = curriculumDao.findById(curriculumResult.getId()).get();
        Hibernate.initialize(curriculumObject.getClasses().getActorClasses());
        courseScheduleList.notifyClasses(curriculumObject);

        // 若增加课表为当天课表;则放入队列中
        if(DateUtils.isSameDay(curriculum.getStartTime(),new Date())){
            System.out.println("上课时间为当天");
            // 放入队列 上课与结课队列
            courseScheduleList.putQueues(curriculumObject);
            // 放入当日课表集合
            courseScheduleList.list.put(""+curriculumObject.getId(),curriculumObject);
        }
        return curriculumResult;
    }

@PathVariable、@RequestBody、@RequestParam

此注解作用于方法的形参上,用来设置绑定路径参数与处理器方法形参间的关系,@PathVariable要求路径参数名与形参名一一对应。@RequestBody 用于接收JSON数据。@RequestParam 用于接收URL地址传参或表单传参

java 复制代码
    @ApiOperation("查询学生参与颗粒的信息")
    @RequestMapping(value="queryUserGrainParticipationInfo/{id}",method= RequestMethod.GET)
    public String queryUserSignParticipationInfo(@PathVariable("id") Long id) throws Exception {
         System.out.println("查询学生参与签到的信息");
	 return id.toString();
    }
java 复制代码
@RequestMapping(value="checkLogin",method= RequestMethod.POST)
    public Actor checkLoginInfo(@RequestBody Actor actor){
        actor = actor.checkStudentLoginInfo();
        // 如果班级不为空,则更新内存该中该学生登录状态
        List<Classes> classList = classesManage.getClassesList();
        Actor finalActor = actor;
        executor.execute(() -> {
        for(Classes classes:classList){
            for(ClassesActor classesActor :classes.getActorClasses()){
                Actor classActor = classesActor.getActor();
                if(classActor.getId().equals(finalActor.getId())){
                    classActor.setIsLogin(1);
                }
            }
          }
        });
        return actor;
    }

总结提升

RESTful风格的接口设计具有简单、灵活、可扩展、易于维护和高性能等优势,逐渐成为现代Web应用开发的主流架构风格。通过遵循RESTful原则,开发者可以设计出更加现代化、高效和易于维护的Web应用。

🎯 此文章对你有用的话记得留言+点赞+收藏哦🎯

相关推荐
NiNg_1_2343 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
Chrikk4 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*4 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue4 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man4 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
customer086 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
Yaml47 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
小码编匠8 小时前
一款 C# 编写的神经网络计算图框架
后端·神经网络·c#