实战:基于Spring Boot快速开发RESTful风格API接口
写在前面的话
这篇文章计划是在过年期间完成的,示例代码都写好了,结果亲戚来我家做客,文章没来得及写。已经很久没有更新文章了,小伙伴们,有没有想我啊。言归正传,下面开始,今天的话题。
目标
写一套符合规范,并且具有RESTful风格的API接口。
假定
- 你已会使用Spring Boot 2.x。
- 你已会使用Gradle构建Spring Boot工程。
- 你已会基于Spring Boot编写API接口。
- 你已会使用接口调试工具。
如果你还不会使用Spring Boot写接口,建议先看一下这篇文章 :
步骤
1、基于Gradle构建Spring Boot示例项目。
2、引入JavaLib。
3、编写接口代码。
4、测试接口。
引入JavaLib
测试版(SNAPSHOT),都会发布到 JitPack 上,所以,从这里拉取的,都会是最新的,但是需要配置仓库地址。
正式版(RELEASE),才会推送到 Maven中央。
UserModel
我们用UserModel来存放我们的数据,以便存取。我个人比较喜欢用bean的,如果你喜欢用Map,那也是可以的。不过需要注意的是,
需要加@JsonInclude(JsonInclude.Include.NON_NULL)
,他的作用是,如果某个字段为空时,在返回的JSON中,则不显示,如果没有,将为 null
。
完整代码如下:
package com.fengwenyi.demojavalibresult.model; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; /** * User Model * @author Wenyi Feng * @since 2019-02-05 */ @Data @Accessors(chain = true) @JsonInclude(JsonInclude.Include.NON_NULL) public class UserModel implements Serializable { private static final long serialVersionUID = -835481508750383832L; /** UID */ private String uid; /** Name */ private String name; /** Age */ private Integer age; }
编写接口返回码
这里我们使用 JavaLib 中result模块为我们提供的方法。只需要调用 BaseCodeMsg.app(Integer, String)
即可。这里我们只写几个用作示例,完整代码如下:
package com.fengwenyi.demojavalibresult.util; import com.fengwenyi.javalib.result.BaseCodeMsg; /** * 自定义返回码以及描述信息 * @author Wenyi Feng * @since 2019-02-05 */ public class CodeMsg { /* user error ------------------------------------------------------------------------------------------------------------*/ /** 用户不存在 */ public static final BaseCodeMsg ERROR_USER_NOT_EXIST = BaseCodeMsg.app(10001, "User Not Exist"); /** UID不能为空 */ public static final BaseCodeMsg ERROR_USER_UID_NOT_NULL = BaseCodeMsg.app(10002, "User UID Must Not null"); }
BaseCodeMsg
我们看一下源码:
package com.fengwenyi.javalib.result; /** * (基类)返回码及描述信息 * @author Wenyi Feng * @since 2019-01-22 */ public class BaseCodeMsg { /** 返回码 */ private Integer code; /** 返回码描述 */ private String msg; /** * 无参数构造方法 */ private BaseCodeMsg() {} /** * 构造方法 * @param code * @param msg */ private BaseCodeMsg(Integer code, String msg) { this.code = code; this.msg = msg; } public static BaseCodeMsg app(Integer code, String msg) { return new BaseCodeMsg(code, msg); } /** * 返回码填充 * @param args 填充内容 * @return CodeMsgEnum */ public BaseCodeMsg fillArgs(Object ... args) { this.msg = String.format(this.msg, args); return this; } /** * 获取返回码 * @return 返回码 */ public Integer getCode() { return code; } /** * 获取描述信息 * @return 描述信息 */ public String getMsg() { return msg; } /** 成功 */ public static final BaseCodeMsg SUCCESS = BaseCodeMsg.app(0, "Success"); /** 失败 */ public static final BaseCodeMsg ERROR_INIT = BaseCodeMsg.app(-1, "Error"); }
成功的标识是:当 code=0
时。
另外,我们还为你提供了预留字符串替换的方法。比如你想告诉用户某个字段不合法,那么你可以这样:
第一步:在CodeMsg中添加
public static final BaseCodeMsg ERROR_PARAM_ILLEGAL = BaseCodeMsg.app(20001, "Request Param Illegal : %s");
第二步:返回
/** * 测试参数错误 * @return {@link Result} */ @GetMapping("/test-param-error") public Result testParamError() { return Result.error(CodeMsg.ERROR_PARAM_ILLEGAL.fillArgs("account")); }
测试结果:
编写接口代码
接下来,开始编写我们的接口代码。
首先指明,我们的接口接收和返回的文档格式。
consumes = MediaType.APPLICATION_JSON_UTF8_VALUE produces = MediaType.APPLICATION_JSON_UTF8_VALUE
再使用 JavaLib 中 Result
。完整代码如下:
package com.fengwenyi.demojavalibresult.controller; import com.fengwenyi.demojavalibresult.model.UserModel; import com.fengwenyi.demojavalibresult.util.CodeMsg; import com.fengwenyi.javalib.result.Result; import org.springframework.http.MediaType; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.PostConstruct; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * User Controller : 用户操作 * @author Wenyi Feng * @since 2019-02-05 */ @RestController @RequestMapping(value = "/user", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UserController { /** 临时存放用户信息 */ private List<UserModel> userModelList = new ArrayList<>(); /** * 初始化用户 */ @PostConstruct public void init() { for (int i = 0; i < 10; i++) userModelList.add(new UserModel().setUid(UUID.randomUUID().toString()).setName("u" + i).setAge(10 + i)); } /** * 查询用户列表 * @return {@link Result} */ @GetMapping("/list") public Result list() { return Result.success(userModelList); } /** * 添加用户 * @param userModel 这里传JSON字符串 * @return {@link Result} */ @PostMapping("/add") public Result add(@RequestBody UserModel userModel) { if (userModel != null) { userModelList.add(userModel.setUid(UUID.randomUUID().toString())); return Result.success(); } return Result.error(); } /** * 根据UID获取用户 * @param uid UID * @return {@link Result} */ @GetMapping("/get/{uid}") public Result getByUid(@PathVariable("uid") String uid) { if (StringUtils.isEmpty(uid)) return Result.error(CodeMsg.ERROR_USER_UID_NOT_NULL); for (UserModel userModel : userModelList) if (userModel.getUid().equals(uid)) return Result.success(userModel); return Result.error(CodeMsg.ERROR_USER_NOT_EXIST); } }
测试
1、启动
2、list
访问:http://localhost:8080/user/list
{ "code": 0, "msg": "Success", "data": [ { "uid": "d8e2dfac-b6e8-46c7-9d43-5bb6bf99ce30", "name": "u0", "age": 10 }, { "uid": "87001637-9f21-4bc7-b589-bea1b2c795c4", "name": "u1", "age": 11 }, { "uid": "5e1398ca-8322-4a68-b0d2-1eb4c1cac9de", "name": "u2", "age": 12 }, { "uid": "e6ee5452-4148-4f6d-b820-9cc24e5c91b5", "name": "u3", "age": 13 }, { "uid": "3f428e26-57e1-4661-8275-ce3777b5da54", "name": "u4", "age": 14 }, { "uid": "b9d994b4-f090-40de-b0f3-e89c613061f2", "name": "u5", "age": 15 }, { "uid": "748d1349-5978-4746-b0c1-949eb5613a28", "name": "u6", "age": 16 }, { "uid": "abaadb7c-23fb-4297-a531-0c490927f6d5", "name": "u7", "age": 17 }, { "uid": "5e5917a1-8674-4367-94c6-6a3fd10a08d6", "name": "u8", "age": 18 }, { "uid": "03ed6a83-0cc0-4714-9d0d-f653ebb3a2eb", "name": "u9", "age": 19 } ] }
2、添加数据
看一下,数据是什么样子
与我们预想的结果一样。
获取数据
有数据样式:
无数据样式:
关于
冯文议。
2017年毕业于阿坝师范学院计算机应用专业。
现就职于深圳警圣技术股份有限公司,主要负责服务器接口开发工作。
技术方向:Java。
开源软件:JavaLib。
后记
到这里就结束了,如果在遇到什么问题,或者有不明白的地方,可以通过评论、留言或者私信等方式,告诉我。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
C/C++程序员工作15年毫无出路吗?
今天看到一个头条上的人感慨找不到会MFC的人,然后大家就七嘴八舌的议论起来 他们要招有经验的人,上海给工资5000-6000 怎么说呢,这个工资,在上海真的没办法活下去 我不想议论工资的高低,只想说关于程序员是吃青春饭的事 许多人感慨程序员就是青春饭,过了35岁,就要转其他的行业 我也很担心这个情况,真的,我是比较喜欢这个职业的,我也知道如果努力的学习,研究,总可以生存下去 并且,真的有许多的出路 因为,客观的需求要求大量的有经验有能力的人来搞IT, 但是我看到有人议论程序员是吃青春饭的,还是感到内心有所动摇 真的,要想做到非人"云亦云,随波逐流"是件很艰难的事情 人总是易受别人的影响 所以,更加的需要我们能够认清社会,认清自己的道路 很难,但要坚持 我的想法: 由于社会发展的需要,所以IT这个产业会继续繁荣下去,很多年 这个产业,会面临各种新的情况,出现各种新的需求,所以需要有经验,有胆识的人去解决 也许,大部分的IT人员干的是不动脑袋的只要熟悉开发环境的就可以搞定的重复性的体力劳动 但这是趋势,一旦一个行业成熟起来,大部分人干的都是体力活 但一如机械一样,这个行业已经成为了经验为大...
- 下一篇
python零基础应该怎样学习入门Python?
前言Python 语言应该如何入门,记得我几年前也碰到过这样的问题,当时网上随便搜了一下饥不择食的找了一些书开始啃起来,结果发现很疑惑,感觉吃力,走了很多弯路。若不得法还会降低初学者的兴趣,现在我就说说自己对python 入门的理解. 学Python和学其他的语言其实是相同的,我给新同事讲课的时候就说学编程和练武功其实是很相似,入门大致这样几步: 找本靠谱的书, 找个靠谱的师傅, 找一个地方开始练习。 学语言也是的:选一本通俗易懂的书,找一个好的视频资料,然后自己装一个IDE工具开始边学变写。下面我具体来讲讲: 1.找一本靠谱的书,难度一定要是入门级别,千万不能太复杂,不要一下子陷进去,会打乱节奏,学东西要循序渐进,不能一口吃个胖子.打个比方,学过java的同学都听过大名鼎鼎的thinking in java,这边书很厚很全,若一上来就学,肯定会吃力,时间长了就会失去兴趣,因此对初学者来说,一定要找一个通熟易懂的,简单的书。入门的书非常关键。 入门的书很多,但是我个人强烈推荐"A Byte of Python",这本书我读了2遍,作者写的思路非常清晰,对每一个知识点讲解的很到位,不多不...
相关文章
文章评论
共有0条评论来说两句吧...