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

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.xdnf.cn/news/14836.html

相关文章:

  • 第一章 从零开始学习大型语言模型-搭建环境
  • Spring Cloud:微服务架构的基石与实践指南
  • 从0开始学习计算机视觉--Day04--损失函数
  • C++动态链接库之非托管封装Invoke,供C#/C++ 等编程语言使用,小白教程——C++动态链接库(一)
  • Linux系统(信号篇)信号的保存
  • 在反向代理环境下精准获取客户端真实 IP 的最佳实践
  • Vue样式绑定与条件渲染详
  • 玄机抽奖Spring Web项目
  • 【STM32 学习笔记】PWR电源控制
  • 高通手机跑AI系列之——穿衣试装算法
  • 数据结构进阶 - 第一章 绪论
  • 数据结构-第三节-树与二叉树
  • 什么是财务共享中心?一文讲清财务共享建设方案
  • Lynx vs React Native vs Flutter 全面对比:三大跨端框架实测分析
  • 人大金仓Kingbase数据库KSQL 常用命令指南
  • Python文件操作完全指南:从入门到精通
  • 广州华锐互动:技术与创意双驱动的 VR 先锋​
  • LightGBM:极速梯度提升机——结构化数据建模的终极武器
  • 柔性制造企业数字化系统建设方案(PPT)
  • LVS-NAT负载均衡群集实战:原理、部署与问题排查
  • 逆向入门(8)汇编篇-rol指令的学习
  • Boss:攻击
  • IoT/HCIP实验-5/基于NB-IoT的智慧农业实验(平台侧开发+端侧编码+基础调试分析)
  • 数据驱动的农产品供应链管理:让“菜篮子”更智慧、更高效
  • aspose.word在IIS后端DLL中高并发运行,线程安全隔离
  • 【Lua 基础学习】
  • 惯性导航——陀螺仪
  • Web层注解
  • 南北差异之——理解业务和理解产品
  • spring中的@Cacheable缓存