当前位置: 首页 > 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

http://www.lqws.cn/news/551611.html

相关文章:

  • 什么是哈希链(Hash Chain)?
  • 计算机组成原理-数据表示与运算(三)
  • 【数据结构】AVL树和红黑树的Insert(插入)(实现map.insert)
  • SpringBoot 防刷 重复提交问题 重复点击问题 注解 RequestParam RequestBody
  • 如何在 Manjaro Linux 上安装 Deepin 桌面
  • 构建证据的系统性知识体系:从理论到实践的完整指南
  • MyBatis 缓存机制详解
  • Python打卡:Day39
  • Java--数组
  • python打卡day56
  • 智能助手(利用GPT搭建智能系统)
  • Netty 的 PooledByteBuf与PooledHeapByteBuf​​
  • Day44 预训练模型
  • MySQL 连接指定端口后,为什么实际仍是 3306?
  • 【深度学习新浪潮】MoE技术入门(简要版)
  • 基于JavaWeb的校园失物招领系统设计与实现
  • 智能制造数字孪生集成交付生态链:智慧产线极速克隆,孪生重构生产周期
  • 飞牛OS安装zerotier组自己的虚拟局域网
  • 利用python实现NBA数据可视化
  • 数学术语之源——(矩阵或行列式的)秩数(rank)
  • UE--Slate 焦点、捕获,输入处理与玩家控制器的关系
  • 基于STM32设计的扫地机器人
  • 从代码学习深度学习 - 自然语言推断与数据集 PyTorch版
  • 什么是 A/B 测试?
  • 机器学习4——参数估计之贝叶斯估计
  • clion与keil分别配置项目宏定义
  • Java-IO流(二)
  • 快慢指针深度解析
  • Object
  • MYSQL-InnoDB逻辑存储结构 详解