最近需要设计一个API服务器,想要把API接口搞得规范一下,就通过网上搜集到了一些资料,以下便是自己的一些理解以及相关的具体实现

本文采用的是spring boot+maven的方案

restful规范

这个规范我在这里也不打算长篇大论地讲解,怎么说呢,有人喜欢有人讨厌,我也不去争,因为我经验不多,看法和大佬有所不同。

restful规范简单来说,就是通过一些关键字去定义url接口,从而让url具有更好的可读性,如下面举个例子

# 查询所有用户
http://localhost:9200/shunbang/api/user/users
# 指定id为1的用户
http://localhost:9200/shunbang/api/user/users/1
# 数据太多,只要前10
http://localhost:9200/shunbang/api/user/users?limit=10
# 从第十条数据后开始(不要前十条数据)
http://localhost:9200/shunbang/api/user/users?offset=10

我觉得restful规范起来,url的可读性较好

restful规范使用的几种方式

方式 说明
get 从服务器上获取资源(select)
put 更新服务器上的资源(update)
post 将传入的资源存储在服务器上(insert)
delete 删除服务器上的资源(delete)

url请求协议介绍

方式 说明 例子
application/x-www-form-urlencoded 默认,客户端通过key-value键值对传递数据 http://localhost:9200/shunbang/api/user/update?id=1&name=xx
application/json 客户端通过body发送json数据
application/xml 客户端通过body发送xml数据
application/octet-stream 客户端通过body发送Binary数据(二进制文件)
multipart/form-data 客户端通过body发送一个表单

API文档生成框架 smart-doc

介绍

这里,我使用了smart-doc这款框架,可以无侵入实现API接口的注释,需要在Controller和实体类中添加注释

使用

使用此开源库很简单,我们只需要在maven项目中添加插件的依赖即可

<plugin>
<groupId>com.github.shalousun</groupId>
<artifactId>smart-doc-maven-plugin</artifactId>
<version>1.0.2</version>
<configuration>
<!--指定生成文档的使用的配置文件,配置文件放在自己的项目中-->
<configFile>./src/main/resources/smart-doc.json</configFile>
<!--指定项目名称-->
<projectName>测试</projectName>
<!--smart-doc实现自动分析依赖树加载第三方依赖的源码,如果一些框架依赖库加载不到导致报错,这时请使用excludes排除掉-->
<excludes>
<!--格式为:groupId:artifactId;参考如下-->
<exclude>com.alibaba:fastjson</exclude>
</excludes>
</configuration>
<executions>
<execution>
<!--如果不需要在执行编译时启动smart-doc,则将phase注释掉-->
<phase>compile</phase>
<goals>
<goal>html</goal>
</goals>
</execution>
</executions>
</plugin>

之后,在resources文件夹中新建smart-doc.json文件,进行一些配置即可

{
"outPath": "Q:\\JavaWebProject\\shunbang\\target", //指定文档的输出路径
"serverUrl": "http://localhost:9200/shunbang", //设置服务器地址,非必须
// "serverUrl": "http://47.101.148.199:9200/shunbang", //设置服务器地址,非必须
"isStrict": false, //是否开启严格模式
"allInOne": true //是否将文档合并到一个文件中,一般推荐为true
}

我这里没开启严格模式,若是开启了严格模式,则调用插件的时候就会报错

之后直接在旁边的插件找到,选择对应生成的文档

之后就可以在输出文件夹中找到html文件了

打开网页,就会有详细的文档了

补充

JsonIgnore注解

若是存在某些敏感字段不需要被返回,在实体类的字段中添加JsonIgnore注解(注意:此JsonIgnore注解为spring boot内置jackson框架自带)

public class JacksonAnnotation {

    /**
* 用户名
*/ @JsonProperty("name")
private String username; /**
* 身份证号
*/
@JsonIgnore
private String idCard;
}

Fastjson使用 @JSONField(serialize = false),起关键作用的是serialize = false

mock注解

smart-doc会在生成的文档的例子中进行自动随机赋值,如下图

如果不想随机赋值,可以使用mock注解指定例子中的数据

ignore注解

这个是smart-doc自带的注解,写在实体类字段的注释上,生成的API文档就会忽略此字段

更多详情,请参考官方文档

具体编码

spring boot中其实内置了GetMappingPostMappingPutMappingDeleteMapping,分别对应的不同的请求方式,如果使用了以上注解,那么发送url请求的方式也是应该相对应,否则服务器不会进行数据的返回

1.指定id

想要通过http://localhost:9200/shunbang/api/user/users/1查询指定id用户信息

使用PathVariable注解

/**
* 查询指定id的用户信息
*
* @param id 用户id
* @return 用户信息
*/
@GetMapping("{id}")
public User selectByPk(@PathVariable("id") Integer id) {
return userMapper.selectOne(new QueryWrapper<User>().eq("user_id", id));
}

2.limit限制

想要通过http://localhost:9200/shunbang/api/user/users?limit=10来获得前几条记录,limit此参数是可选的,使用RequestParam注解

当用户没有输入limit参数,则显示返回所有的数据,有的话则进行数据的限制,offset也是同理,之后便不多说了

/**
* 查询所有用户
*
* @return 用户列表的json
*/
@GetMapping("users")
public List<User> selectAll(@RequestParam(required = false) Integer limit) {
if (limit == null) {
return userMapper.selectList(null);
} else {
System.out.println(limit);
return userMapper.selectList(null);
}
}

3.传递实体类

原本我是想要通过http://localhost:9200/shunbang/api/user/update?jsonData=xx这样传递实体类的json数据,之后由后台接收json数据,并再将json数据转为实体类对象,调用update方法,进行表记录的update

其实,有个方法比上面的方法更简单,使用RequestBody注解,之后进行put的请求,将json数据直接通过body传递

@PutMapping("update")
public boolean updateUser(@RequestBody User user) {
return user.updateById();
}

Java发送url请求

HttpURLConnection conn =new URL("address").openConnection();
conn.setRequestMethod("PUT"); // 可以根据需要 提交 GET、POST、DELETE、PUT等http提供的功能
conn.setRequestProperty("Content-Type", " application/json");//设定 请求格式 json,也可以设定xml格式的

上述是原生的,之后我会在补充使用okhttp框架进行相关的接口申请数据

我是使用的postwoman进行API的测试

参考

smart-doc

SpringBoot RestFul风格API接口开发

Post 方法参数写在body中和写在url中有什么区别?知乎严振杰回答

Spring框架学习笔记(9)——API接口设计相关知识及具体编码实现的更多相关文章

  1. Flask框架学习笔记(API接口管理平台 V1.0)

    今天博主终于完成了API接口管理平台,最后差的就是数据库的维护, 博主这里介绍下平台的设计原理,首先基于python,利用flask的web框架+bootstrap前端框架完成,先阶段完成了前台展示页 ...

  2. Flask框架学习笔记(API接口管理平台 V2.0)

    博主今天把API接口管理平台发布到github了,这次是更新一些功能 如支持本地数据库sqlite3.优化了数据结构 技术方面跟之前V1.0相同,只增加生产本地数据:但是为了支持层级的参数,修改了数据 ...

  3. Spring框架学习笔记(5)——Spring Boot创建与使用

    Spring Boot可以更为方便地搭建一个Web系统,之后服务器上部署也较为方便 创建Spring boot项目 1. 使用IDEA创建项目 2. 修改groupid和artifact 3. 一路n ...

  4. Spring框架学习笔记(8)——spring boot+mybatis plus+mysql项目环境搭建

    之前写的那篇Spring框架学习笔记(5)--Spring Boot创建与使用,发现有多小细节没有提及,,正好现在又学习了mybatis plus这款框架,打算重新整理一遍,并将细节说清楚 1.通过I ...

  5. Spring框架学习笔记(1)

    Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...

  6. 手写Spring框架学习笔记

    以下是咕泡公开课的学习笔记 一.创建工程springdemo 二.在pom中配置servlet <dependency> <groupId>javax.servlet</ ...

  7. Spring框架学习笔记(3)——SpringMVC框架

    SpringMVC框架是基于Spring框架,可以让我们更为方便的进行Web的开发,实现前后端分离 思路和原理 我们之前仿照SpringMVC定义了一个自定义MVC框架,两者的思路其实都是一样的. 建 ...

  8. spring框架学习笔记7:事务管理及案例

    Spring提供了一套管理项目中的事务的机制 以前写过一篇简单的介绍事务的随笔:http://www.cnblogs.com/xuyiqing/p/8430214.html 还有一篇Hibernate ...

  9. Spring框架学习笔记(1)——控制反转IOC与依赖注入DI

    Spring框架的主要作用,就是提供了一个容器,使用该容器就可以创建并管理对象.比如说Dao类等,又或者是具有多依赖关系的类(Student类中包含有Teacher类的成员变量) Spring有两个核 ...

随机推荐

  1. Linux学习之路--常用命令讲解

    Linux常用命令讲解 1.命令格式:命令 [-选项]  [参数] 超级用户的提示符是# 一般用户的提示符是$ 如:ls -la /usr说明: 大部分命令遵从该格式多个选项时,可以一起写 eg:ls ...

  2. 1037 在霍格沃茨找零钱 (20 分)C语言

    题目描述 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二 十九个纳特(Knut)兑一个西可 ...

  3. 网络爬虫简单介绍(python)

    一.简介 爬虫就是利用代码大量的将网页前端代码下载下来使用的一种程序,一般来说常见的目的为下: 1.商业分析使用:很多大数据公司都会从利用爬虫来进行数据分析与处理,比如说要了解广州当地二手房的均价走势 ...

  4. Nginx流量复制

    1. 需求 将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如: 可以验证功能是否正常,以及服务的性能: 用真实有效的流量请求去验证,又不用造数据,不影响线上正常访问: 这跟灰度发布还 ...

  5. Time、Date拼接成TimeStamp

    Time.Date拼接成TimeStamp 有关于Time类型.Date类型的数据这里不再赘述,本文旨在讲解如何将数据库中的Time.Date类型取出来并转换成TimeStamp类型,话不多说,先看代 ...

  6. 原生js中call、apply、bind的区别和相同点

    结论: 相同点: 1.都是js原生方法,改变函数中的this指向 2.都可以传递参数,第一个参数为 把this指向到哪里去,即目标元素 不同点: 1.call和apply都是主动触发,绑定后自动执行, ...

  7. 原生js面向对象编程-选项卡(自动轮播)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. 【ARM】---STM32位带操作总结---浅显易懂

    正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种“低能 ...

  9. Google搜索成最大入口,简单谈下个人博客的SEO

    个人静态博客SEO该考虑哪些问题呢?本篇文章给你答案 咖啡君在开始写文章时首选了微信公众号作为发布平台,但公众号在PC端的体验并不好,连最基本的文章列表都没有,所以就搭建了运维咖啡吧的网站,可以通过点 ...

  10. html包含html文件的方法

    我们在写asp页面的时候,常常使用include命令来包含公共文件.由于这个方法用起来非常方便,于是很多人在HTML页面里尝试使用include,但是发现根本就不起作用.这是因为,include是VB ...