Spring-Boot Restful Api
1、Restful API开发
1.1 Restful简介
springMVC对编写Restful Api提供了很好的支持。
Restful Api有三个主要的特性:
是基于Http协议的,是无状态的。
是以资源为导向的
人性化的,返回体内部包含相关必要的指导和链接
面向资源?
传统的Api接口以动作为导向,并且请求方法单一。例如/user/query?id=1 GET方法 ;/user/create
POST方法 而在resultful风格下以资源为导向,例如: /user/id(GET方法,获取) /user/(POST方法,创建)
restful api 用url描述资源,用Http方法描述行为,用Http状态码描述不同的结果,使用json作为交互数据(包括入参和响应)
restful只是一种风格并不是一种强制的标准
1.2 编写restful api 测试用例
因为restful api 与传统api存在一些风格上的差异,例如以method代表行为。所以在开发的过程中需要一边开发一边测试,测试我们的接口是否达到了预期的目的。springBoot提供了开发restful api测试用例的方法。首先导入依赖
org.springframework.boot
spring-boot-starter-test
1.3 编写restful接口
1.3.1 基本注解
@RestController 声明一个controller负责提供restful接口
@RequestMapping 将请求的url映射到方法
@RequetParam 映射请求参数到方法请求参数 可以指定required指定此参数是否必填,name参数指定别名,defaultValue指定默认值。在传参时,SpringMVC会自动封装参数,所以可以在方法中用一个对象参数接收
1.3.2 @PathVariable
映射url片段到java方法参数
@GetMapping("/user/{id}")
public User getUserInfo(@PathVariable("id") String id){
return new User("sico","12345");
}
1.3.3 在url声明中使用正则表达式
在@pathVariable中url片段默认可以接收任何格式,任何类型,可以用正则表达式加以限定,例如:
/**
* 获取用户详情,利用正则表达式限定为只接收数字
* @param id
* @return
*/
@GetMapping("/user/{id:\\d+}")
public User getUserInfo(@PathVariable("id") String id){
return new User("sico","12345");
}
1.3.4 使用@jsonView控制json输出内容
SpringMVC会将实体对象转换成json返回。有时候我们希望在不同的请求中隐藏一些字段。可以用@JsonView控制输出内容。
使用@jsonView注解有以下步骤:
使用接口来声明多个视图
在值对象的getter方法上指定视图
在controller方法上指定视图
使用接口声明视图
此接口只作声明使用,可以直接放置到目标实体内部,示例:
public class User implements Serializable{
public interface SimpleView{};
public interface DetailView extends SimpleView{};
//....
}
注意继承关系,DetailView继承了SimpleView。即视图DetailView会显示被SimpleView标注的视图
在值对象上的getter方法上指定视图
@JsonView(SimpleView.class)
public String getUsername() {
return username;
}
//...
@JsonView(DetailView.class)
public String getPassword() {
return password;
}
在方法上指定视图
/**
* 获取用户详情,利用正则表达式限定为只接收数字
* @param id
* @return
*/
@GetMapping("/user/{id:\\d+}")
@JsonView(User.DetailView.class)
public User getUserInfo(@PathVariable("id") String id){
return new User("sico","12345");
}
由于视图的继承关系,DetailView任然会显示被SimpleView标注的字段
1.3.5 RequestMapping的变体
RequestMapping有以下变体,他们分别对应了不同的请求方法
@GetMapping 对应GET方法
@PostMapping 对应POST方法
@PutMapping 对应PUT方法
@DeleteMapping 对应DELETE方法
1.3.5 @RequestBody将请求体映射到java方法参数
@(spring)RequestBody将请求中的请求体中的实体数据转换成实体对象,常用语PUT和POST
/**
* 创建用户
* 仅有加入@RequestBody注解才能解析出请求体重传入的实体数据
*/
@PutMapping("/user")
public void create(@RequestBody User user){
User user1=new User("cocoa","123",1);
}
1.3.6 @Valid注解和BindingResult验证请求参数的合法性并处理校验结果
一般需要在请求接口中校验请求参数,例如参数是否为空,是否唯一等。
@NotBlack 非空注解,将此注解加到实体类属性上。
@NotBlank
private String username;
在请求方法的字段上加上@valid注解时,以上的注解将生效。如果请求接口的参数无法通过校验,将返回400
@PutMapping("/user")
public void create(@Valid @RequestBody User user){
User user1=new User("cocoa","123",1);
}