实战:基于Spring Boot快速开发RESTful风格API接口

客官°小女子只卖身不卖艺 2022-03-07 01:48 982阅读 0赞

写在前面的话

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

目标

写一套符合规范,并且具有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

完整代码如下:

  1. package com.fengwenyi.demojavalibresult.model;
  2. import com.fasterxml.jackson.annotation.JsonInclude;
  3. import lombok.Data;
  4. import lombok.experimental.Accessors;
  5. import java.io.Serializable;
  6. /**
  7. * User Model
  8. * @author Wenyi Feng
  9. * @since 2019-02-05
  10. */
  11. @Data
  12. @Accessors(chain = true)
  13. @JsonInclude(JsonInclude.Include.NON_NULL)
  14. public class UserModel implements Serializable {
  15. private static final long serialVersionUID = -835481508750383832L;
  16. /** UID */
  17. private String uid;
  18. /** Name */
  19. private String name;
  20. /** Age */
  21. private Integer age;
  22. }

编写接口返回码

这里我们使用 JavaLib 中result模块为我们提供的方法。只需要调用 BaseCodeMsg.app(Integer, String)即可。这里我们只写几个用作示例,完整代码如下:

  1. package com.fengwenyi.demojavalibresult.util;
  2. import com.fengwenyi.javalib.result.BaseCodeMsg;
  3. /**
  4. * 自定义返回码以及描述信息
  5. * @author Wenyi Feng
  6. * @since 2019-02-05
  7. */
  8. public class CodeMsg {
  9. /*
  10. user error
  11. ------------------------------------------------------------------------------------------------------------*/
  12. /** 用户不存在 */
  13. public static final BaseCodeMsg ERROR_USER_NOT_EXIST = BaseCodeMsg.app(10001, "User Not Exist");
  14. /** UID不能为空 */
  15. public static final BaseCodeMsg ERROR_USER_UID_NOT_NULL = BaseCodeMsg.app(10002, "User UID Must Not null");
  16. }

BaseCodeMsg

我们看一下源码:

  1. package com.fengwenyi.javalib.result;
  2. /**
  3. * (基类)返回码及描述信息
  4. * @author Wenyi Feng
  5. * @since 2019-01-22
  6. */
  7. public class BaseCodeMsg {
  8. /** 返回码 */
  9. private Integer code;
  10. /** 返回码描述 */
  11. private String msg;
  12. /**
  13. * 无参数构造方法
  14. */
  15. private BaseCodeMsg() {}
  16. /**
  17. * 构造方法
  18. * @param code
  19. * @param msg
  20. */
  21. private BaseCodeMsg(Integer code, String msg) {
  22. this.code = code;
  23. this.msg = msg;
  24. }
  25. public static BaseCodeMsg app(Integer code, String msg) {
  26. return new BaseCodeMsg(code, msg);
  27. }
  28. /**
  29. * 返回码填充
  30. * @param args 填充内容
  31. * @return CodeMsgEnum
  32. */
  33. public BaseCodeMsg fillArgs(Object ... args) {
  34. this.msg = String.format(this.msg, args);
  35. return this;
  36. }
  37. /**
  38. * 获取返回码
  39. * @return 返回码
  40. */
  41. public Integer getCode() {
  42. return code;
  43. }
  44. /**
  45. * 获取描述信息
  46. * @return 描述信息
  47. */
  48. public String getMsg() {
  49. return msg;
  50. }
  51. /** 成功 */
  52. public static final BaseCodeMsg SUCCESS = BaseCodeMsg.app(0, "Success");
  53. /** 失败 */
  54. public static final BaseCodeMsg ERROR_INIT = BaseCodeMsg.app(-1, "Error");
  55. }

成功的标识是:当 code=0 时。

另外,我们还为你提供了预留字符串替换的方法。比如你想告诉用户某个字段不合法,那么你可以这样:

第一步:在CodeMsg中添加

  1. public static final BaseCodeMsg ERROR_PARAM_ILLEGAL = BaseCodeMsg.app(20001, "Request Param Illegal : %s");

第二步:返回

  1. /**
  2. * 测试参数错误
  3. * @return {@link Result}
  4. */
  5. @GetMapping("/test-param-error")
  6. public Result testParamError() {
  7. return Result.error(CodeMsg.ERROR_PARAM_ILLEGAL.fillArgs("account"));
  8. }

测试结果:

Test Param Error

编写接口代码

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

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

  1. consumes = MediaType.APPLICATION_JSON_UTF8_VALUE
  2. produces = MediaType.APPLICATION_JSON_UTF8_VALUE

再使用 JavaLib 中 Result。完整代码如下:

  1. package com.fengwenyi.demojavalibresult.controller;
  2. import com.fengwenyi.demojavalibresult.model.UserModel;
  3. import com.fengwenyi.demojavalibresult.util.CodeMsg;
  4. import com.fengwenyi.javalib.result.Result;
  5. import org.springframework.http.MediaType;
  6. import org.springframework.util.StringUtils;
  7. import org.springframework.web.bind.annotation.*;
  8. import javax.annotation.PostConstruct;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. import java.util.UUID;
  12. /**
  13. * User Controller : 用户操作
  14. * @author Wenyi Feng
  15. * @since 2019-02-05
  16. */
  17. @RestController
  18. @RequestMapping(value = "/user",
  19. consumes = MediaType.APPLICATION_JSON_UTF8_VALUE,
  20. produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
  21. public class UserController {
  22. /** 临时存放用户信息 */
  23. private List<UserModel> userModelList = new ArrayList<>();
  24. /**
  25. * 初始化用户
  26. */
  27. @PostConstruct
  28. public void init() {
  29. for (int i = 0; i < 10; i++)
  30. userModelList.add(new UserModel().setUid(UUID.randomUUID().toString()).setName("u" + i).setAge(10 + i));
  31. }
  32. /**
  33. * 查询用户列表
  34. * @return {@link Result}
  35. */
  36. @GetMapping("/list")
  37. public Result list() {
  38. return Result.success(userModelList);
  39. }
  40. /**
  41. * 添加用户
  42. * @param userModel 这里传JSON字符串
  43. * @return {@link Result}
  44. */
  45. @PostMapping("/add")
  46. public Result add(@RequestBody UserModel userModel) {
  47. if (userModel != null) {
  48. userModelList.add(userModel.setUid(UUID.randomUUID().toString()));
  49. return Result.success();
  50. }
  51. return Result.error();
  52. }
  53. /**
  54. * 根据UID获取用户
  55. * @param uid UID
  56. * @return {@link Result}
  57. */
  58. @GetMapping("/get/{uid}")
  59. public Result getByUid(@PathVariable("uid") String uid) {
  60. if (StringUtils.isEmpty(uid))
  61. return Result.error(CodeMsg.ERROR_USER_UID_NOT_NULL);
  62. for (UserModel userModel : userModelList)
  63. if (userModel.getUid().equals(uid))
  64. return Result.success(userModel);
  65. return Result.error(CodeMsg.ERROR_USER_NOT_EXIST);
  66. }
  67. }

测试

1、启动

启动项目

2、list

访问:http://localhost:8080/user/list

  1. {
  2. "code": 0,
  3. "msg": "Success",
  4. "data": [
  5. {
  6. "uid": "d8e2dfac-b6e8-46c7-9d43-5bb6bf99ce30",
  7. "name": "u0",
  8. "age": 10
  9. },
  10. {
  11. "uid": "87001637-9f21-4bc7-b589-bea1b2c795c4",
  12. "name": "u1",
  13. "age": 11
  14. },
  15. {
  16. "uid": "5e1398ca-8322-4a68-b0d2-1eb4c1cac9de",
  17. "name": "u2",
  18. "age": 12
  19. },
  20. {
  21. "uid": "e6ee5452-4148-4f6d-b820-9cc24e5c91b5",
  22. "name": "u3",
  23. "age": 13
  24. },
  25. {
  26. "uid": "3f428e26-57e1-4661-8275-ce3777b5da54",
  27. "name": "u4",
  28. "age": 14
  29. },
  30. {
  31. "uid": "b9d994b4-f090-40de-b0f3-e89c613061f2",
  32. "name": "u5",
  33. "age": 15
  34. },
  35. {
  36. "uid": "748d1349-5978-4746-b0c1-949eb5613a28",
  37. "name": "u6",
  38. "age": 16
  39. },
  40. {
  41. "uid": "abaadb7c-23fb-4297-a531-0c490927f6d5",
  42. "name": "u7",
  43. "age": 17
  44. },
  45. {
  46. "uid": "5e5917a1-8674-4367-94c6-6a3fd10a08d6",
  47. "name": "u8",
  48. "age": 18
  49. },
  50. {
  51. "uid": "03ed6a83-0cc0-4714-9d0d-f653ebb3a2eb",
  52. "name": "u9",
  53. "age": 19
  54. }
  55. ]
  56. }

2、添加数据

添加数据

看一下,数据是什么样子

添加数据

与我们预想的结果一样。

获取数据

有数据样式:

有数据

无数据样式:

无数据

关于

冯文议。

2017年毕业于阿坝师范学院计算机应用专业。

现就职于深圳警圣技术股份有限公司,主要负责服务器接口开发工作。

技术方向:Java。

开源软件:JavaLib。

后记

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

发表评论

表情:
评论列表 (有 0 条评论,982人围观)

还没有评论,来说两句吧...

相关阅读