1. 概述
基于接口编程是解耦的基本原则,工作中经常需要定义接口,看似没有什么技术难题,但需要良好的编程习惯来约束。
2. 常见“坏”接口
返回
Map
,可读性差
@GetMapping("/{id}")public Mapget(@PathVariable Integer id){ }
返回
Object
,大忌!使用者或者维护者不知道具体返回格式,接口可以随意改动
@GetMapping("/{id}")public Object get(@PathVariable Integer id){ if(user =! null){ return user; } else { return false; }}
返回
void
,无用接口
@DeleteMapping("/{id}")public void delete(@PathVariable Integer id){ }
参数过于复杂,如:参数出现
json
格式,可读性不好,代码也难看
@PostMapping("/update")public Mapupdate(long id, String jsonStr) {}
参数为
HttpServletRequest
,可读性查,不利于维护
@PostMapping("/update")public Object update(HttpServletRequest request) {}
3. Controller规范
RESTful
风格,推荐阅读上一篇SpringBoot基础教程,搭建RESTful风格Web服务
4. 统一响应规范
建议所有接口返回统一的格式
R
,方便调用者封装
public class Rimplements Serializable { private T data; //服务端数据 private int status = 0; //状态码,0:成功,1:失败 private String msg = ""; //描述信息 // 省略 set get public static R isOk() { return new R().msg("成功"); } public static R isFail() { return new R().status(1).msg("失败"); } public static R isFail(Throwable e) { return isFail().msg(e); } public R msg(Throwable e) { this.setMsg(e.toString()); return this; } public R data(T data) { this.setData(data); return this; } public R msg(String msg){ this.setMsg(msg); return this; } public R status(int status) { this.setStatus(status); return this; }}
Controller中如何使用
@RequestMapping("/users")@RestControllerpublic class UserController { @GetMapping("/ok") public Rok(){ User user = new User(); user.setUserId(1); user.setName("Mkeeper"); user.setAge(28); return R.isOk().data(user); } @GetMapping("/fail") public R
测试结果
注意
R
只允许再Controller层使用,不允许往后传,类似传Map
,json
;可读性大大降低Contorller
只做参数格式转换,如果没有参数需要转换的,那么就一行代码。日志/参数校验/权限判断建议放到service
里面,毕竟controller
基本无法重用,而service
重用较多。而我们的单元测试也不需要测试controller
,直接测试service
即可。
5. 工程目录
6. 结束语
良好的编程风格,是高效的前提,技术固然重要,好习惯让你事半功倍。有任何建议,欢迎留言探讨,。
欢迎关注博主公众号:Java十分钟