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