个人博客:兰陵笑笑生,欢迎浏览博客!html
上一章 SpringBoot入门实践(三)-工程结构与经常使用注解当中,咱们介绍了SpringBoot的项目的工程结构和一些经常使用的注解。本章简单的讲一讲API的设计。html5
网上有很是多的关于API设计的介绍,本章内容从本身的实际经验简单介绍如何更好的设计API。java
1 任何客户端都可以调用,须要一个标准,使得客户端和服务端达成一致,必须简单spring
2 api独立于客户端,api的发展,现有的客户端能够继续运行,不须要修改。json
REST API 是围绕这资源设计的,资源有一个惟一的标识符,而且使用JSONapi
使用HTTP 定义资源的操做app
在springBoot当中提供了不少的注解,使用这些注解就很容易的实现RESTful的apidom
该注解有6个参数:this
例如请求 表示一個GET请求:url
@RequestMapping(path = "/list",method = RequestMethod.GET, consumes ="application/json") public HttpResponse list() { List<User> user = new ArrayList<>(userMap.values()); return HttpResponse.ok().setData(user); }
等价于@RequestMapping(path = "/**",method = RequestMethod.POST)
等价于@RequestMapping(path = "/**",method = RequestMethod.GET)
等价于@RequestMapping(path = "/**",method = RequestMethod.DELETE)
等价于@RequestMapping(path = "/**",method = RequestMethod.PUT)
URL的定义在每一个公司中都不同,这里简单给出一些我本身的实际经验,url路径定义:
1 url理解简单
2 api有版本控制, 版本控制能够快速迭代并避免无效的请求访问已更新的接入点
http://www.example.com/api/v{version}/模块名称/操做名称
GET /api/v1/user/get/1
或者
GET /api/v1/user/1
POST /api/v1/user/list
POST /api/v1/user/save
DELETE /api/v1/user/delete/12
或者
DELETE /api/v1/user/12
public class User { private Long id; private String userName; private Long age; ... }
自定义统一返回结果
package com.miroservice.chapter2.common; import com.fasterxml.jackson.annotation.JsonInclude; import java.io.Serializable; import java.util.*; @JsonInclude(JsonInclude.Include.NON_NULL) public class HttpResponse implements Serializable { private long code; private String message; private Long total; private Object data; private List<Object> table; private String requestid; public static final long CODE_SUCCESS = 200; public static final long CODE_ERROR = 500; public static final long CODE_VALIDATE_FAILED = 404; public static final long CODE_UNAUTHORIZED = 401; public static final long CODE_FORBIDDEN = 403; public HttpResponse() { this(200, (String) null); } public HttpResponse(long code, String message) { this.code = CODE_SUCCESS; this.code = code; this.message = message; this.requestid = UUID.randomUUID().toString().replaceAll("-", ""); } public static HttpResponse error(String message) { return new HttpResponse(500, message); } public HttpResponse setData(Object data) { this.data = data; return this; } public HttpResponse data(Object data) { return this.setData(data); } public HttpResponse addListItem(Object item) { if (this.table == null) { this.table = new ArrayList(); } this.table.add(item); return this; } public HttpResponse setTotal(Long total) { this.total = total; return this; } public HttpResponse setTotal(Integer total) { this.total = (long) total; return this; } public static HttpResponse ok() { return new HttpResponse(); } public HttpResponse set(String field, String value) { if (this.data == null || !(this.data instanceof Map)) { this.data = new HashMap(); } ((Map) this.data).put(field, value); return this; } public long getCode() { return this.code; } public HttpResponse setCode(long code) { this.code = code; return this; } public String getMessage() { return this.message; } public HttpResponse setMessage(String message) { this.message = message; return this; } public Long getTotal() { return this.total == null && this.table != null ? Long.valueOf(String.valueOf(this.table.size())) : this.total; } public Object getData() { return this.data; } public List<Object> getTable() { return this.table; } public HttpResponse setTable(List table) { this.table = table; return this; } public HttpResponse table(List table) { return this.setTable(table); } public String getRequestid() { return this.requestid; } public HttpResponse setRequestid(String requestid) { this.requestid = requestid; return this; } }
Controller层
/** * 1 api 的设计 一眼明了 * 2 有版本 * 3 控制层统一返回自定义的结果 */ @RestController @RequestMapping("/api/v1/user") public class UserController { static Map<Long, User> userMap = new HashMap<Long, User>(); /** * 列表请求 * @return */ @RequestMapping(method = RequestMethod.GET, consumes = "application/json") @GetMapping(consumes = "application/json") public HttpResponse list() { List<User> user = new ArrayList<>(userMap.values()); return HttpResponse.ok().setData(user); } /** * 保存 * @param user * @return */ @PostMapping("/save") public HttpResponse save(@RequestBody User user) { userMap.put(user.getId(), user); return HttpResponse.ok(); } /** * 获取单个用户 * @param id * @return */ @GetMapping("/get/{id}") public HttpResponse get(@PathVariable Long id) { final User user = userMap.get(id); return HttpResponse.ok().setData(user); } /** * 删除 * @param id * @return */ @DeleteMapping("/delete/{id}") public HttpResponse delete(@PathVariable Long id) { userMap.remove(id); return HttpResponse.ok(); } }
以上就是本期的分享,你还能够关注本博客的#Spring Boot入门实践系列!#
参考: #微软的API实践#
     #[Spring REST DOC](https://docs.spring.io/spring-restdocs/docs/2.0.3.RELEASE/reference/html5/)#
本文由博客一文多发平台 OpenWrite 发布!
个人博客[兰陵笑笑生] ( http://www.hao127.com.cn/),欢...!