文档章节

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

冯文议
 冯文议
发布于 02/20 22:45
字数 1370
阅读 121
收藏 3

写在前面的话

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

目标

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

后记

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

© 著作权归作者所有

冯文议
粉丝 11
博文 47
码字总数 47895
作品 0
成都
高级程序员
私信 提问
补习系列-springboot-restful应用

一、目标 了解 Restful 是什么,基本概念及风格; 能使用SpringBoot 实现一套基础的 Restful 风格接口; 利用Swagger 生成清晰的接口文档。 二、Restful 入门 什么是REST 摘自百科的定义:R...

美码师
2018/08/05
0
0
renren-security 3.1.0 发布:拿来即用的权限管理系统

采用SpringBoot、MyBatis、Shiro框架,开发的一套权限系统,极低门槛,拿来即用。设计之初,就非常注重安全性,为企业系统保驾护航,让一切都变得如此简单。 具有如下特点: 灵活的权限控制,...

独孤求胜16
2018/01/28
5K
8
springboot模块化开发之后,页面跳转不能解析

springboot模块化开发之后,页面跳转不能解析 项目背景: 我的项目自己开发了一个基础调用解析的api,需要借助springboot框架提供restful接口。 为了使用我的API,把API和SpringBoot封装在2...

emily13961
2018/08/27
523
2
SpringBootBucket 1.0.0 发布,SprintBoot 全家桶

Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。 本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通过“一...

一刀
2018/03/05
8.7K
17
springBoot 搭建web项目(前后端分离,附项目源代码地址)

概述 该项目包含springBoot-example-ui 和 springBoot-example,分别为前端与后端,前后端分离,利用ajax交互。 前端html 技术: + + + + 该项目git地址:https://github.com/jiangcaijun/sp...

开源小菜鸟2333
2017/11/01
15.7K
2

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
401
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
4
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
3
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
6
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部