请求与响应
一、请求
1.实现请求的必须注解
(1)@RestController
在Controller类前添加该注解,该注解集成了@Controller
和@ResponseBody
(2)@RestMapping(“…”)
在Controller类中的方法前添加该注解,双引号里填写请求资源位置,例如在创建好的SpringBoot项目中新建一个名为HelloController.class文件,添加以下代码:
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello world!";
}
}
然后在SpringBoot的启动类*“项目名+Application”.class*文件中运行SpringBoot项目。若运行成功,则在浏览器输入“localhost:8080/hello”,浏览器显示hello world!则说明资源访问成功。
(3)请求方式
要设置请求的方式固定为GET、POST、PUT、DELETE,有以下两种方式。
方式一:调用@RestMapping(“…”)注解中的method属性
@RequestMapping(value = "/depts", method = RequestMethod.GET) //指定请求方式为GET
public Result list(){
log.info("查询全部部门数据");
//调用Service查询部门数据
List<Dept> deptList = deptService.list();
return Result.success(deptList);
}
方式二:直接使用@GetMapping、@DeleteMapping、@PostMapping、@PutMapping代替@RestMapping注解
这四个注解实现了@RestMapping注解的内容,只是将method属性的值提前设置好了。
@GetMapping("/{id}")
public Result listById(@PathVariable Integer id){
log.info("根据id查询部门:{}", id);
Dept dept = deptService.listById(id);
return Result.success(dept);
}
2.请求过程中可能常用的注解
(1)抽离相同的请求资源路径
假如在同一个Controller类中有多个请求,但是请求的资源路径都包含了相同的部分,如下图所示:
可以在该Controller类前面使用*@RequestMapping(“/depts”)*将相同资源地址前缀抽离出来,类中的子注解会直接将该地址设为起始地址
(2)获取请求路径中的变量参数
在编写请求接口时,若要获取请求路径中的变量参数的值,可以使用@PathVariable
注解来实现,例如如下所示,要根据id删除信息,请求的url路径为/{id},通过在方法定义的形参前面添加@PathVariable
注解就可以获取到请求路径中的id的值:
/**
* 删除部门
* @return
*/
@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id){
log.info("根据id删除部门:{}",id);
//调用Service删除部门
deptService.delete(id);
return Result.success();
}
注意:方法定义的形参名应当与请求资源路径{…}中的名字一样
(3)获取请求体中的JSON格式数据
在编写请求接口时,若要获取请求体中的JSON格式数据,可以使用@RequestBody
注解来实现,例如如下所示,要根据新增数据信息,通过在方法定义的形参前面添加@RequestBody
注解就可以获取到请求体中JSON格式数据。
此处形参类型为抽象类对象:
Dept:
- Integer id
- String name
- LocalDateTime createTime
- LocalDateTime updateTime
请求体中的JSON数据为:
JSON:
{
id : 1
name : 学工部
}
/**
* 新增部门
* @return
*/
@PostMapping
public Result add(@RequestBody Dept dept){
log.info("新增部门:{}", dept);
deptService.add(dept);
return Result.success();
}
注意:此处请求体JSON所携带的数据名字要与dept中的属性名相同。
(4)为接口方法的形参设置默认值
例如在进行分页查询时,要为分页查询请求的方法中定义的形参设置默认值:page(页码)为1,pageSize(每页数据)为10,可以使用@RequestParam
注解中的defaultValue属性来设置,如下所示:
/**
* 分页查询
* @param page
* @param pageSize
* @return
*/
@GetMapping("/emps")
public Result page(@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10")Integer pageSize){
log.info("分页查询信息:{},{}",page,pageSize);
PageBean pageBean = empService.page(page, pageSize);
return Result.success(pageBean);
}
(5)获取请求路径中的值为日期格式
若要获取形如”2020-01-01“这种日期格式的值,可以使用@DateTimeFormat
注解来实现转格式,例如如下代码:
/**
* 分页查询
* @param page
* @param pageSize
* @return
*/
@GetMapping("/emps")
public Result page(@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10")Integer pageSize,
String name, Short gender,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){
log.info("分页查询信息:{},{},{},{},{},{}",page,pageSize,name,gender,begin,end);
//调用service分页查询
PageBean pageBean = empService.page(page, pageSize,name,gender,begin,end);
return Result.success(pageBean);
}
二、响应
1.实现响应的必须注解
(1)@ResponseBody
位置:Controller类/方法上
作用:将方法的返回值直接响应,若返回值类型是实体对象/集合,转JSON格式响应
(2)统一响应结果
Result(code、msg、data)
2.RestFul接口规范
- REST(REpresentational State Transfer),表述性状态转换,它是一种软件架构风格
传统风格:
- GET:查询
- POST:新增
- POST:修改
- GET:删除
REST风格:
- GET:查询
- POST:新增
- PUT:修改
- DELETE:删除
- REST是风格,是约定方式,约定不是规定,可以打破。、
- 描述模块的功能通常使用复数,也就是加s的格式来描述,表示此类资源,而非单个资源。如:users、emps、books…
三、@Slf4j注解
传统的方式想要在日志中输出我们想要的内容,需要在Controller控制层类中定义一个Logger对象才能实现。如下所示:
private static Logger log = LogFactory.getLog(DeptController.class);
log.info("查询全部部门数据");
而@Slf4j
注解中定义了该对象,在Controller控制层类前面引用@Slf4j
注解后不需要定义Logger对象也能直接使用log.info()
。
层类中定义一个Logger对象才能实现。如下所示:
private static Logger log = LogFactory.getLog(DeptController.class);
log.info("查询全部部门数据");
而@Slf4j
注解中定义了该对象,在Controller控制层类前面引用@Slf4j
注解后不需要定义Logger对象也能直接使用log.info()
。