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

v2-8cbdea3153cda704b557baa9ed8cfdbc_1440w.jpg?source=172ae18b

写在前面的话

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

目标

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

测试结果:

v2-d59073c00d8be61785b63ef6dbdda024_b.jpg

编写接口代码

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

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

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、启动

v2-c64f3bfa20cac3455db29e3557d53a3e_b.jpg

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、添加数据

v2-29577dc4f29907ef52320e1f52bd9211_b.jpg

看一下,数据是什么样子

v2-c1f54c1d0629c06a3ff130df6bfe7cd2_b.jpg

与我们预想的结果一样。

获取数据

有数据样式:

v2-f270598a0c39fe10529f70dd99cb472e_b.jpg

无数据样式:

v2-a4be5997517b0d67a6e55f992ba062d2_b.jpg

关于

冯文议。

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

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

技术方向:Java。

开源软件:JavaLib。

后记

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转:elasticsearch nested嵌套查询

转自&#xff1a; 【弄nng - Elasticsearch】DSL入门篇&#xff08;七&#xff09;—— Nested类型查询&#xff0c;聚合_司马缸砸缸了-CSDN博客文章目录1. nested query2. nested 对象聚合项目推荐nested类型就是为了解决object类型在对象数组上丢失关联性的问题的&#xff0…

谷粒商城RabbitMQ锁库存逻辑详解--新理解(长文警告)

前言 不废话&#xff0c;上来就说&#xff0c;代码我会放挺多&#xff0c;写过这个项目的自然能懂&#xff0c;如果真的像理解的请认真看哦 分析 /*出现的问题&#xff1a;扣减库存成功了&#xff0c;但是由于网络原因超时&#xff0c;出现异常&#xff0c;导致订单事务回滚&…

NIO学习–核心概念与基本读写

转载自 NIO学习–核心概念与基本读写这两天花了时间学习了java的nio&#xff0c;看的书是Ron Hitchens著的 《Java NIO》&#xff0c;总的来说&#xff0c;这本书真的写的非常好&#xff0c;而且整本书将java nio的内容从底层讲了个遍&#xff0c;书不厚&#xff0c;但是确实值…

python3安装mysql模块_Python安装MySQL库详解,步骤及错误的解决方法

前面我们介绍的Python网络爬虫通常将抓取的数据存储至TXT或CSV文件&#xff0c;而当数据量增加之时&#xff0c;就需要将其存储至本地数据库了。Python访问数据库需要对应的接口程序&#xff0c;我们可以把接口程序理解为Python的一个模块&#xff0c;它提供了数据库客户端的接…

centos8安装docker

【README】本文参考了 docker官方文档安装指南&#xff0c; Install Docker Engine on CentOS | Docker DocumentationInstructions for installing Docker Engine on CentOShttps://docs.docker.com/engine/install/centos/ 【1】安装前的工作 1.需要centos7或8上&#xff1b…

34.在排序数组中查找元素的第一个和最后一个位置--leetcode算法题解(带注释)

public int[] searchRange(int[] nums, int target) {//先决条件排除一部分if(target < nums[0] || target > nums[nums.length - 1]){return new int[]{-1,-1};}//初始化左右边界int l 0;int r nums.length - 1;//初始化数组int[] arr {-1,-1};int mid 0;//代表左边…

datagridview绑定数据源不显示_sharding-jdbc系列之 数据源配置(一)

spring boot Yaml方式Bean定义一个Config类&#xff0c;配置数据源&#xff0c;上面的代码很简单&#xff0c;无非就是获取yaml文件&#xff0c;然后通过YmlByteArrayDataSource创建一个dataSource public YmlByteArrayDataSource继承了ShardingDataSource&#xff0c;调用了su…

关于 NIO 你不得不知道的一些“地雷”

转载自 关于 NIO 你不得不知道的一些“地雷”本文是笔者在学习NIO过程中发现的一些比较容易让人忽略的知识的一个总结&#xff0c;而这些让人忽略的小细节恰恰是NIO网络编程中必不可少。虽然现在我们不会直接编写NIO来完成我们的网络层通讯&#xff0c;而是使用成熟的基于NIO的…

转:Centos防火墙设置与端口开放的方法

转自&#xff1a; Centos防火墙设置与端口开放的方法_tianxin的专栏-CSDN博客Centos升级到7之后&#xff0c;内置的防火墙已经从iptables变成了firewalld。所以&#xff0c;端口的开启还是要从两种情况来说明的&#xff0c;即iptables和firewalld。更多关于CentOs防火墙的最新…

583. 两个字符串的删除操作用时6ms的另类解法

开门见山 看见这道题&#xff0c;我的第一反应不是去找出符合这道题的动态规划递推公式&#xff0c;我反而认为可以借用一下1143. 最长公共子序列的题解 class Solution {public int longestCommonSubsequence(String text1, String text2) {int[][] dp new int[text1.lengt…

Java 非阻塞 IO 和异步 IO

转载自 Java 非阻塞 IO 和异步 IO上一篇文章介绍了 Java NIO 中 Buffer、Channel 和 Selector 的基本操作&#xff0c;主要是一些接口操作&#xff0c;比较简单。 本文将介绍非阻塞 IO 和异步 IO&#xff0c;也就是大家耳熟能详的 NIO 和 AIO。很多初学者可能分不清楚异步和非阻…

element js 包含字符_selenium3.x(10)js弹框处理

web应用中&#xff0c;经常会遇到弹框。不处理弹框&#xff0c;页面其他元素都是不能操作的。js弹框有3种&#xff1a;alert警告框、confirm确认窗口、prompt信息输入窗口。webdriver提供了处理这3种弹框的方法。首先通过switch_to定位到弹框&#xff0c;然后针对弹框的不同&am…

转:centos8开启防火墙端口

转自&#xff1a; Centos8开放防火墙端口_Programmer-Awei的博客-CSDN博客查看防火墙某个端口是否开放firewall-cmd --query-port3306/tcp开放防火墙端口3306firewall-cmd --zonepublic --add-port3306/tcp --permanent查看防火墙状态systemctl status firewalld关闭防火墙sys…

AQS的细节--自用,非正常教程

AQS的概念 AQS叫抽象队列同步器&#xff0c;是一个框架&#xff0c;我们可以在JUC很多包看见AQS的具体实现&#xff0c;比如锁和读写锁&#xff0c;condition等&#xff0c;具有可扩展性&#xff0c;可以根据此自定义同步工具类&#xff0c;优点是系统开销低&#xff0c;实现锁…

mininet编程实现交换机规则的插入、删除与修改。_可编程网卡芯片在滴滴云网络的应用实践...

桔妹导读&#xff1a;随着云规模不断扩大以及业务层面对延迟、带宽的要求越来越高&#xff0c;采用DPDK 加速网络报文处理的方式在横向纵向扩展都出现了局限性。可编程芯片成为业界热点。本文主要讲述了可编程网卡芯片在滴滴云网络中的应用实践&#xff0c;遇到的问题、带来的收…

centos8上docker tomcat容器访问报404解决方法

目录 【README】 【1】docker安装tomcat 【2】启动多个tomcat容器 【README】 1.本文记录了 访问docker tomcat容器报404的解决方法&#xff1b; 2.附带安装tomcat步骤&#xff1b; 3.centos8 安装docker&#xff0c;refers2 centos8安装docker_PacosonSWJTU的博客-CSDN博…

ConcurrentHashMap--自用,非教学

结论先行&#xff0c;细节在下面 jdk1.7是如何解决并发问题的以及完整流程 一.首先new一个concurrentHashMap 调用默认构造方法 二.初始化 初始化initialCapacity&#xff08;默认是16&#xff0c;指一个segment内Entry的数量&#xff09;&#xff0c;loadFactor&#xff…

Java开发必须掌握的线上问题排查命令

转载自 Java开发必须掌握的线上问题排查命令作为一个合格的开发人员&#xff0c;不仅要能写得一手还代码&#xff0c;还有一项很重要的技能就是排查问题。这里提到的排查问题不仅仅是在coding的过程中debug等&#xff0c;还包括的就是线上问题的排查。由于在生产环境中&#x…

centos8启动docker-mysql8容器

【README】 本文记录了 centos8 安装&#xff0c;启动mysql8的docker容器的步骤&#xff1b; 【1】安装mysql8 docker容器 步骤1&#xff0c; 查看mysql8 docker镜像版本 &#xff1b; 最简单的方式是上 Docker Hubhttps://hub.docker.com/直接搜索mysql&#xff0c;查看其 …

Java命令学习系列(一)——Jps

转载自 Java命令学习系列&#xff08;一&#xff09;——Jpsjps位于jdk的bin目录下&#xff0c;其作用是显示当前系统的java进程情况&#xff0c;及其id号。 jps相当于Solaris进程工具ps。不象"pgrep java"或"ps -ef grep java"&#xff0c;jps并不使用应用…