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

简介: 写在前面的话这篇文章计划是在过年期间完成的,示例代码都写好了,结果亲戚来我家做客,文章没来得及写。已经很久没有更新文章了,小伙伴们,有没有想我啊。言归正传,下面开始,今天的话题。目标写一套符合规范,并且具有RESTful风格的API接口。

写在前面的话

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

目标

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

测试结果:

Test Param Error

编写接口代码

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

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

consumes = MediaType.APPLICATION_JSON_UTF8_VALUE
produces = MediaType.APPLICATION_JSON_UTF8_VALUE

再使用 JavaLibResult。完整代码如下:

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。

后记

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

目录
相关文章
|
3天前
|
数据采集 搜索推荐 API
小红书笔记详情 API 接口的开发、应用与收益
小红书(RED)作为国内领先的生活方式分享平台,汇聚了大量用户生成内容(UGC),尤其是“种草”笔记。小红书笔记详情API接口为开发者提供了获取笔记详细信息的强大工具,包括标题、内容、图片、点赞数等。通过注册开放平台账号、申请API权限并调用接口,开发者可以构建内容分析工具、笔记推荐系统、数据爬虫等应用,提升用户体验和运营效率,创造新的商业模式。本文详细介绍API的开发流程、应用场景及潜在收益,并附上Python代码示例。
107 61
|
4天前
|
供应链 搜索推荐 数据挖掘
阿里巴巴热卖商品推荐 API 接口的开发、应用与收益
阿里巴巴热卖商品推荐API为开发者提供了获取平台热卖商品信息的强大工具,涵盖商品标题、价格、销量等数据。通过注册开放平台账号、申请API权限并调用接口,开发者可构建热卖商品推荐系统、数据分析工具及供应链管理系统等应用,提升用户体验与运营效率,创造新的商业模式。该API采用RESTful风格,支持多种应用场景,助力电商从业者实现创新与增值。
34 7
|
6天前
|
供应链 数据挖掘 API
1688APP 原数据 API 接口的开发、应用与收益
1688作为阿里巴巴旗下的B2B平台,汇聚海量供应商和商品资源。其APP原数据API接口为开发者提供获取商品详细信息的强大工具,涵盖商品标题、价格、图片等。通过注册开放平台账号、申请API权限并调用接口,开发者可构建比价工具、供应链管理及自动化上架工具等应用,提升用户体验与运营效率,创造新的商业模式。示例代码展示了如何使用Python调用API并解析返回结果。
53 8
|
4天前
|
搜索推荐 数据挖掘 API
亚马逊详情 API 接口的开发、应用与收益
亚马逊详情API接口是亚马逊开放平台提供的强大工具,允许开发者编程获取商品的详细信息,如标题、价格、描述等。通过注册账号、申请权限并调用API,开发者可构建比价工具、推荐系统和数据分析工具等应用,提升用户体验与运营效率,创造新商业模式。本文详细介绍其开发流程、应用场景及潜在收益,并附代码示例。
19 6
|
消息中间件 存储 安全
干货|SpringBoot JMS(ActiveMQ)API实践应用详解
Active是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。AC-tiveMQ使用Apache提供的...
336 0
|
20天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的留守儿童爱心网站设计与实现(计算机毕设项目实战+源码+文档)
博主是一位全网粉丝超过100万的CSDN特邀作者、博客专家,专注于Java、Python、PHP等技术领域。提供SpringBoot、Vue、HTML、Uniapp、PHP、Python、NodeJS、爬虫、数据可视化等技术服务,涵盖免费选题、功能设计、开题报告、论文辅导、答辩PPT等。系统采用SpringBoot后端框架和Vue前端框架,确保高效开发与良好用户体验。所有代码由博主亲自开发,并提供全程录音录屏讲解服务,保障学习效果。欢迎点赞、收藏、关注、评论,获取更多精品案例源码。
57 10
|
20天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的家政服务管理平台设计与实现(计算机毕设项目实战+源码+文档)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
42 8
|
20天前
|
JavaScript 搜索推荐 Java
基于SpringBoot+Vue实现的家乡特色推荐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
40 8
|
20天前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生就业服务平台设计与实现(系统源码+文档+数据库+部署等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
54 6
|
20天前
|
JavaScript Java 测试技术
基于Java+SpringBoot+Vue实现的车辆充电桩系统设计与实现(系统源码+文档+部署讲解等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
49 6

热门文章

最新文章