博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实战:基于Spring Boot快速开发RESTful风格API接口
阅读量:5909 次
发布时间:2019-06-19

本文共 6998 字,大约阅读时间需要 23 分钟。

写在前面的话

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

目标

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

假定

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

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

步骤

1、基于Gradle构建Spring Boot示例项目。

2、引入JavaLib。

3、编写接口代码。

4、测试接口。

引入JavaLib

测试版(SNAPSHOT),都会发布到 上,所以,从这里拉取的,都会是最新的,但是需要配置仓库地址。

正式版(RELEASE),才会推送到

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;}

编写接口返回码

这里我们使用 中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"));    }

测试结果:

Test Param Error

编写接口代码

接下来,开始编写我们的接口代码。

首先指明,我们的接口接收和返回的文档格式。

consumes = MediaType.APPLICATION_JSON_UTF8_VALUEproduces = MediaType.APPLICATION_JSON_UTF8_VALUE

再使用 中 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
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

访问::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。

后记

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

转载地址:http://smvpx.baihongyu.com/

你可能感兴趣的文章
解析spring启动加载dubbo过程
查看>>
uva 1400 - "Ray, Pass me the dishes!"
查看>>
MAVEN 配置阿里巴巴镜像
查看>>
今天我来了
查看>>
Java并发编程(一)
查看>>
Android 运行过程
查看>>
结队项目——智能订餐系统用户调研报告
查看>>
php中 $$str 中 "$$" 的解释
查看>>
程序猿的能力拓展模型
查看>>
[LeetCode][Java] Container With Most Water
查看>>
线程专用钩子和全局钩子的差别
查看>>
Swift开发教程--怎样自己定义TabBarItem的图片显示
查看>>
【Bug历练手册】Frame must be terminated with a null octet
查看>>
MySQL5.6 windows7下安装及基本操作
查看>>
cin.get()、流和缓冲区
查看>>
设计模式及面向对象的设计原则
查看>>
通讯录封装实现
查看>>
Linux时钟
查看>>
【转】AlphaGo与人工智能
查看>>
MMU内存管理单元
查看>>