写在前面的话

这篇文章计划是在过年期间完成的,示例代码都写好了,结果亲戚来我家做客,文章没来得及写。已经很久没有更新文章了,小伙伴们,有没有想我啊。言归正传,下面开始,今天的话题。

目标

写一套符合规范,并且具有RESTful风格的API接口。

假定

  • 你已会使用Spring Boot 2.x。
  • 你已会使用Gradle构建Spring Boot工程。
  • 你已会基于Spring Boot编写API接口。
  • 你已会使用接口调试工具。

如果你还不会使用Spring Boot写接口,建议先看一下这篇文章 :

用Spring Boot开发API接口

步骤

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<>();/*** 初始化用户*/@PostConstructpublic 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。

后记

到这里就结束了,如果在遇到什么问题,或者有不明白的地方,可以通过评论、留言或者私信等方式,告诉我。

java restful接口开发实例_实战:基于Spring Boot快速开发RESTful风格API接口相关推荐

  1. java quartz spring_JavaLib-quartz | 基于Spring Boot Quartz开发的定时任务

    基于Spring Boot Quartz开发的JavaLib-quartz,目的是帮你快速构建定时任务系统,你可以专心编写你的业务逻辑,而不必关注定时任务具体是如何实现的,他的性能如何,有没有异常以及 ...

  2. 基于Spring boot框架开发的电商网站系统

    目 录 第一章 绪论- 2 1.1 编写目的 - 2 1.2 项目背景 - 2 1.3 项目需求 - 2 第二章 系统体系结构 - 3 2.1 系统体系结构 - 3 2.2 数据库设计 E-R 图 - ...

  3. 10个Spring Boot快速开发的项目,接私活利器(快速、高效)

    本文为大家精选了 码云 上优秀的 Spring Boot 语言开源项目,涵盖了企业级系统框架.文件文档系统.秒杀系统.微服务化系统.后台管理系统等,希望能够给大家带来一点帮助:) 1.项目名称:分布式 ...

  4. exchange邮件服务器_基于Spring Boot快速实现发送邮件功能

    邮件在项目中经常会被用到,比如用邮件发送通知.比如,通过邮件注册.认证.找回密码.系统报警通知.报表信息等.本篇文章带大家通过SpringBoot快速实现一个发送邮件的功能. 邮件协议 下面先简单了解 ...

  5. 接口访问次数_如何基于spring开发自定义注解实现对接口访问频次限制?

    做JavaWeb的开发的同学们都应该遇到过,客户要求某个接口进行频次的限制,如每秒并发10个,或者短信验证码发送场景,60秒内只允许发送一次. 通常开发的小伙伴们肯定是拿到以上需求在接口逻辑里进行实现 ...

  6. java 新浪短链接_新浪(t.cn)短网址链接生成api接口

    最新的新浪(t.cn)短网址生成api接口,快速生成t.cn超短链接,接口可以正常调用,觉得不错可以收藏一下. 新浪短网址api接口: 使用说明: 将api接口地址中 "http://www ...

  7. 牛皮!竟然有大佬基于 Spring Boot + Vue 开发了一套网易云amp;QQ音乐(附源码)。。。...

    来源:segmentfault.com/a/1190000021376934 # 前言 虽然 B/S 是目前开发的主流,但是 C/S 仍然有很大的市场需求.受限于浏览器的沙盒限制,网页应用无法满足某些 ...

  8. Spring Boot 无侵入式 实现API接口统一JSON格式返回

    作者 | 小魏小魏我们去那里呀 来源 | blog.csdn.net/qq_34347620/article/details/102239179 无侵入式 统一返回JSON格式 其实本没有没打算写这篇 ...

  9. Spring Boot快速开发企业级Admin管理后台

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客:点 ...

最新文章

  1. llist对象两个属性相乘在相加_Java8使用stream实现list中对象属性的合并(去重并求和)...
  2. python爬虫小说代码示例-Python从零开始写爬虫-4 解析HTML获取小说正文
  3. Zynq的AMP开发流程说明(基于OCM)
  4. 报告显示,媒体行业已成撞库攻击常见目标
  5. java 重启tomcat_linux下重启tomcat的命令
  6. 空间自相关的知识总结
  7. android stringbuilder 一次插入多条数据_android开发面试题解析
  8. Django文件上传***
  9. linux 网卡驱动 优化,Linux多核环境网卡驱动优化研究①.PDF
  10. c++ tcp 服务器和客户端例子
  11. oracle备份文件命令,oracle备份命令使用实例
  12. android 弹出软键盘将底部视图顶起问题
  13. 9.Linux性能诊断 --- Web应用安全:攻击,防护与检测,IPv6,容器安全
  14. 超强电脑工具箱!100个神器一款软件全搞定!效率必备!
  15. 斗鱼直播云原生实践之注册中心篇
  16. 区块链上的中国?2018见分晓
  17. 推荐几款项目管理工具 总有一款适合你
  18. MySQLSyntaxErrorException
  19. 从零开始学python的第19天
  20. [Shader]踩脚印

热门文章

  1. P3804 【模板】后缀自动机 (SAM)
  2. Gym - 100952H--H. Special Palindrome--dp整数划分(模板)
  3. 【CF1199 D,E, F】Welfare State // Matching vs Independent Set // Rectangle Painting 1
  4. 1.14 日志(递推ybtoj)
  5. P4859-已经没有什么好害怕的了【容斥,dp】
  6. 51nod1220-约数之和【莫比乌斯反演,杜教筛】
  7. P1600-天天爱跑步【LCA,桶,树上差分】
  8. ssl提高组周一备考赛【2018.10.29】
  9. 【2018.3.10】模拟赛之四-ssl2133 腾讯大战360【SPAF,图论,最短路径】
  10. 【模板】最大密度子图