目录
4.2 SpringBoot2.X开发HTTP接口GET请求
4.3 SpringBoot2.X统一接口返回协议(开发规范)
4.4 SpringBoot2.X开发HTTP接口POST请求
4.1 架构搭建
- 创建项目
- 配置启动类
- 创建对应的包,先建立以下几个包,后面需要的再补充:
controller、service、dao、domain、utils...
- 初始化数据开发
- controller:存放控制器;
- mapper: (dao层)返回层;
- service:存放接口和对应的实现类;
- impl:为了解耦;
- domain:存放实体类;
- utils:存放工具类;
4.2 SpringBoot2.X开发HTTP接口GET请求
1.GET请求
- 场景:一般的查询接口用的就是get请求;
- 注解:@GetMapping = @RequestMapping(method = RequestMethod.GET)
2.注解
- @GetMapping = @RequestMapping(method = RequestMethod.GET)
- @PostMapping = @RequestMapping(method = RequestMethod.POST)
- @PutMapping = @RequestMapping(method = RequestMethod.PUT)
- @DelecteMapping = @RequestMapping(method = RequestMethod.DELETE)
3.编辑一个简单的视频列表接口
1.video类
/**
* 视频类
* */
public class Video implements Serializable {
private int id;
private String title; //标题
private String summary; //简介
private int price;
private String coverImg; //封面
private Date createTime; //创建时间
public Video(){}
public Video(int id, String title) {
this.id = id;
this.title = title;
this.createTime = new Date();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getCoverImg() {
return coverImg;
}
public void setCoverImg(String coverImg) {
this.coverImg = coverImg;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "Video{" +
"id=" + id +
", title='" + title + '\'' +
", summary='" + summary + '\'' +
", price=" + price +
", coverImg='" + coverImg + '\'' +
", createTime=" + createTime +
'}';
}
}
2.VideoMapper类
@Repository
public class VideoMapper {
private static Map<Integer, Video> videoMap = new HashMap<>();
static {
videoMap.put(1,new Video(1,"Rick and Morty s1"));
videoMap.put(2,new Video(2,"Rick and Morty s2"));
videoMap.put(3,new Video(3,"Rick and Morty s3"));
videoMap.put(4,new Video(4,"Rick and Morty s4"));
videoMap.put(5,new Video(5,"Rick and Morty s5"));
}
public List<Video> listVideo(){
List<Video> list = new ArrayList<>();
list.addAll(videoMap.values());
return list;
}
}
3.VideoService类
public interface VideoService {
public List<Video> listVideo();
}
4.VideoServiceImpl类
@Service
public class VideoServiceImpl implements VideoService {
@Autowired
private VideoMapper videoMapper;
@Override
public List<Video> listVideo() {
return videoMapper.listVideo();
}
}
5.VedioController类
/**
* 视频控制器
* */
@RestController
@RequestMapping("/api/v1/vedio")
public class VedioController {
@Autowired
private VideoService videoService;
// @RequestMapping(value = "list",method = RequestMethod.GET)
@GetMapping("list")
public Object list(){
List<Video> list = videoService.listVideo();
return list;
}
}
注:
- 注意加注解;
- 跑程序之前注意端口占用
结果:
4.3 SpringBoot2.X统一接口返回协议(开发规范)
- 上述代码存在的问题:协议未统一,缺少业务状态码;
- JSONData工具类开发
JsonData类
public class JsonData {
private int code;
private Object data;
private String Msg;
public JsonData() {
}
public JsonData(int code, Object data) {
this.code = code;
this.data = data;
}
public JsonData(int code, Object data, String msg) {
this.code = code;
this.data = data;
this.Msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String getMsg() {
return Msg;
}
public void setMsg(String msg) {
Msg = msg;
}
public static JsonData buildSuccess(Object data){
return new JsonData(0,data,"success");
}
public static JsonData buildFail(String msg){
return new JsonData(-1,"",msg);
}
public static JsonData buildError(String msg,int code){
return new JsonData(code,"",msg);
}
}
运行结果:
4.4 SpringBoot2.X开发HTTP接口POST请求
1.POST请求
- 场景:表单提交,如果不用细分PUT/DELETE方法,都可以使用POST;
- 注解:@PostMapping = @RequestMapping(method = RequestMethod.POST)
2.编辑一个简单的账号密码提交登录接口,form表单形式
注:添加公开和私人两种状态;
情境1:
@PostMapping("login")
public JsonData login(String username, String pwd) {
System.out.println("user=" + username + "pwd=" + pwd);
String token = userService.login(username, pwd);
return token == null ? JsonData.buildFail("用户名密码错误") :
JsonData.buildSuccess(token);
}
情境2:
@PostMapping("login")
public JsonData login(User user) {
String token = userService.login(user.getUsername(), user.getPwd());
return token == null ? JsonData.buildFail("用户名密码错误") :
JsonData.buildSuccess(token);
}
情境3:
@PostMapping("login")
public JsonData login(@RequestBody User user) {
String token = userService.login(user.getUsername(), user.getPwd());
return token == null ? JsonData.buildFail("用户名密码错误") :
JsonData.buildSuccess(token);
}
4.5 使用RequestBody对象提交数组
新增章集类Chapter:
public class Chapter {
private int id;
private int videoId;
private String title;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getVideoId() {
return videoId;
}
public void setVideoId(int videoId) {
this.videoId = videoId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String toString() {
return "Chapter{" +
"id=" + id +
", videoId=" + videoId +
", title='" + title + '\'' +
'}';
}
}
修改Video类,新增章集列表字段:
public class Video implements Serializable {
private int id;
private String title; //标题
private String summary; //简介
private int price;
private String coverImg; //封面
private Date createTime; //创建时间
private List<Chapter> listChapter;
public Video(){}
public Video(int id, String title) {
this.id = id;
this.title = title;
this.createTime = new Date();
}
public Video(int id, String title, List<Chapter> listChapter) {
this.id = id;
this.title = title;
this.listChapter = listChapter;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getCoverImg() {
return coverImg;
}
public void setCoverImg(String coverImg) {
this.coverImg = coverImg;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public List<Chapter> getListChapter() {
return listChapter;
}
public void setListChapter(List<Chapter> listChapter) {
this.listChapter = listChapter;
}
@Override
public String toString() {
return "Video{" +
"id=" + id +
", title='" + title + '\'' +
", summary='" + summary + '\'' +
", price=" + price +
", coverImg='" + coverImg + '\'' +
", createTime=" + createTime +
", listChapter=" + listChapter +
'}';
}
}
修改VideoController类,新增Chapter上传入口:
//上传章集列表
@PostMapping("save_chapter_list")
public Object listChapter(@RequestBody Video video){
System.out.println(video.toString());
return JsonData.buildSuccess("");
}
运行及结果:
4.6 SpringBoot2.X中定制JSON字段
1.SpringBoot配置Jackson处理字段
- 常用框架:阿里fastjson,谷歌gson等;
- JavaBean序列化为json:
1.性能:Jackson > FastJson > Gson > Json-lib 同个结构
2.Jackson、FastJson、Gson类库各有优点,各有自己的专长;
3.空间换时间,时间换空间;
- jackson处理相关注解:
1.指定字符不返回:@JsonIgnore;
2.制定日期格式:
@JsonFormat(pattern="yyyy-mm-dd hh:mm:ss",locale="zh",timezone="GMT+8")
3.空字段不返回:@JsonnInclude(Include.NON_NULL)
4.指定别名:@JsonProperty
![](https://i-blog.csdnimg.cn/blog_migrate/93d7db4bb1eca7dea9699ee13a4935d4.png)
- 序列化操作
//序列化
String jsonStr = objectMapper.writeValueAsString(list);
System.out.println(jsonStr);
return JsonData.buildSuccess(list);
//反序列化
List<Video> temp = objectMapper.readValue(jsonStr,List.class);