当前位置: 首页 > news >正文

SpringMVC系列(七)(Restful架构风格(下))(完结篇)

0 引言

作者正在学习SpringMVC相关内容,学到了一些知识,希望分享给需要短时间想要了解SpringMVC的读者朋友们,想用通俗的语言讲述其中的知识,希望与诸位共勉,共同进步!

本系列会持续更新!!可以放心食用!

ps:RestFul架构风格会分为上中下三篇来描述,名字分别为系列五-系列七,这三篇会同一时间发布!!!

1 Restful返回统一格式

在我们的本系列(六)中,介绍了业务代码中几个包的作用,但我们会发现controller包所返回的数值格式不是很统一,在企业中,需要返回统一格式:

code:业务的状态码,分成成功码和失败码,可以根据不同的状态码进行不同的处理

msg:服务端给前端返回的提示消息,描述此次操作的成功或者失败原因,例如返回"余额不足"。

data:服务器返回给前端的数据都放在这里面

{

        "code": XXX,

        "msg": XXX,

        "data":XXX}

按照上述要求,我们先建立一个R对象,来封装上述三个信息:

新建一个包Common,类名为R,代码如下:

import lombok.Data;@Data
public class R<T> {private Integer code;private String message;//因为可能会又各种数据,所以用Object类型private T data;public static <T> R<T> success(T object) {R<T> r = new R<T>();r.data = object;r.code = 200;//成功的状态码r.message = "操作成功";return r;}public static R success() {R r = new R<>();r.code = 200;//成功的状态码r.message = "操作成功";return r;}}

里面放入两个重载的success的方法,一个表示存在data返回,一个不存在data返回(读者也可以看情况给出error的方法,本篇就不再赘述)。所以Cotroller包下的方法也需要做出改造:

@RestController
@RequestMapping("/employee")
public class EmployeeRestController {@AutowiredEmployeeService employeeService;@GetMapping(value = "/{id}")public R<Employee> getEmployee(@PathVariable Long id) {Employee emp = employeeService.getEmp(id);return R.success(emp);}@DeleteMapping(value = "/{id}")public R deleteEmployee(@PathVariable Long id) {employeeService.deleteEmp(id);return R.success();}@PostMapping()public R saveEmployee(@RequestBody Employee employee) {employeeService.saveEmp(employee);return R.success();}@PutMapping()public R updateEmployee(@RequestBody Employee employee) {employeeService.updateEmp(employee);return R.success();}

我们就发现可以统一是返回R对象的这么一种格式,有返回数据的可以在返回值泛型中加上具体data的类型即可,如getEmployee方法所示。

拿getEmployee方法做一个测试:

网页显示:

2 跨域

研究这个问题之前首先我们先获得前端代码:
前端代码https://pan.baidu.com/s/1HUkez2KlFNXgHmtLUv8c8w?pwd=we7e 提取码: we7e 

需要将这个文件放置在纯英文以及没有空格的路径上,双击按钮及启动。

以及一个新方法,就是查看所有员工:

Controller包底下添加:

    @GetMapping("/employees")public R<List<Employee>> getEmployees() {return R.success(employeeService.getEmployees());}

service接口:

List<Employee> getEmployees();

service实现类:

    @Overridepublic List<Employee> getEmployees() {List<Employee> employees = employeeDao.getEmployees();return employees;}

Dao接口中:

List<Employee> getEmployees();

Dao实现类:

    @Overridepublic List<Employee> getEmployees() {String sql = "select * from employee";List<Employee> employees = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Employee.class));return employees;}

添加完毕,当我们真正进行前后端联调的时候可能还会出现跨源资源共享策略(CORS)的问题,当我启动前端页面http://localhost/:

刷新页面,可以看到方法查询的方法报错被阻止访问查询所有员工。也就是说游览器为了安全,默认会遵循同源策略(会限制ajax请求,图片,css以及js),即项目所在服务器和请求的服务器是同一个,如果不是请求会被拦截。

1)当前浏览器页面地址:http://localhost/

2)查看前端请求地址:http://localhost:8080/api/v1/employees

地址在“/”以前的必须完全一样,游览器才能把请求(ajax类型的请求)发出去!!!

跨域问题解决:

后端解决方法:允许前端跨域

原理:服务器给游览器的响应头中增加字段:Access-Control-Allow-Origin = *;

具体实现:SpringMVC框架下在Controller类头上加上注解@CrossOrigin即可.

最终展示:

界面可以看到数据库中的所有内容。

如果想直接看完整代码可以直接去这个地址:

lin/Restful_codehttps://gitee.com/lin2002wei/restful_code

参考:

P111-P113

113.RESTful - CRUD案例 - 跨域_哔哩哔哩_bilibili

相关文章:

  • pytorch中的几个概念
  • 剑指offer48_两个链表的第一个公共节点
  • Node.js特训专栏-实战进阶:10.MongoDB文档操作与聚合框架
  • 创建套接字时和填充地址时指定类型的异同
  • Color Hunt - 简约漂亮的配色网站
  • 华为云鸿蒙应用入门级开发者认证 实验部分题目及操作步骤
  • CCleaner Pro v6.29.11342 绿色便携版
  • 【攻防实战】实战中的某钉RCE
  • 设计模式 (四)
  • 【力扣 中等 C】79. 单词搜索
  • Java基础(Maven配置)
  • 【Elasticsearch】most_fields、best_fields、cross_fields 的区别与用法
  • JVM调优实战 Day 10:性能指标采集与可视化
  • 单元测试和集成测试的区别
  • 鸿蒙 Scroll 组件深度解析:丝滑滚动交互全场景实现
  • spring中maven缺少包如何重新加载,报错java: 程序包org.springframework.web.reactive.function不存在
  • win10部署本地LLM和AI Agent
  • docker-compose部署nacos
  • 基于Uniapp+SpringBoot+Vue 的在线商城小程序
  • 前端面试专栏-主流框架:15.Vue模板编译与渲染流程