极简SpringBoot指南-Chapter04-基于SpringBoot的书籍管理Web服务
仓库地址
Chapter04-基于SpringBoot的书籍管理Web服务
从本章开始,我们将会基于SpringBoot框架,来编写一块书籍管理的应用。为了契合我们的简单教程原则,项目不会出现复杂的结构,只会有一个通用的结构。
初始结构
我们项目的初始结构如下:
base-package
|-- controller
|-- BookController.class
|-- model
|-- Book.class
BookManagementSystemApp.class
Book类
public class Book {
/**
* 书籍ID
*/
private String id;
/**
* 书籍名称
*/
private String name;
/**
* 书籍价格
*/
private double price;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
BookController类
@RestController
@RequestMapping("books") // url:"books"
public class BookController {
private final List<Book> bookList;
/**
* 构造函数
* 内部进行bookList初始化操作,便于下面的测试
*/
public BookController() {
int count = 3;
this.bookList = new ArrayList<>(count);
Random random = new Random();
for (int idx = 0; idx < count; idx++) {
Book book = new Book();
book.setId(Integer.toString(idx));
book.setName("book@" + idx);
book.setPrice(random.nextInt(100) + 1);
this.bookList.add(book);
}
}
/**
* GET /books
* 返回所有的书籍信息
*/
@GetMapping
public List<Book> getBookList() {
return bookList;
}
/**
* GET /books/{id}
* 根据书籍ID,得到对应的书籍信息
* @param id 书籍ID
* @return 书籍
*/
@GetMapping("{id}")
public Book getBookById(@PathVariable("id") String id) {
Optional<Book> first = this.bookList
.stream()
.filter(b -> b.getId().equals(id))
.findFirst();
return first.orElse(null);
}
/**
* POST /books
* 添加书籍信息
* 需要注意的是,入参Book需要添加注解@RequestBody,才能通过HTTP JSON形式传入
* @param book 希望新增的书籍信息
*/
@PostMapping
public void addBook(@RequestBody Book book) {
if (book == null) {
System.out.println("请求数据book为空,未进行添加");
return;
}
// 服务端生成ID
String nextId = Integer.toString(this.bookList.size());
book.setId(nextId);
this.bookList.add(book);
}
/**
* PUT /books/{id}
* 更新指定ID书籍的信息,
* 需要注意的是,入参Book需要添加注解@RequestBody,才能通过HTTP JSON形式传入
* @param id 希望更新的书籍信息
* @param book 希望更新的书籍信息
*/
@PutMapping("{id}")
public void updateBook(@PathVariable("id") String id, @RequestBody Book book) {
if (book == null || id == null) {
System.out.println("请求数据book为空或指定书籍id为空,终止更新");
return;
}
Optional<Book> first = this.bookList
.stream()
.filter(b -> b.getId().equals(id))
.findFirst();
if (first.isPresent()) {
Book exist = first.get();
exist.setName(book.getName());
exist.setPrice(book.getPrice());
}
}
/**
* DELETE /books/{id}
* 根据书籍ID删除对应的书籍信息
* @param id 待删除的书籍ID
*/
@DeleteMapping("{id}")
public void deleteBook(@PathVariable("id") String id) {
if (id == null || id.trim().equals("")) {
return;
}
Optional<Book> existBook = this.bookList
.stream()
.filter(b -> b.getId().equals(id))
.findFirst();
existBook.ifPresent(this.bookList::remove);
}
}
对于该Controller,我们添加了如下的5个API:
- 获取所有的书籍信息(GET /books)
- 获取指定ID的书籍信息(GET /books/{id})
- 增加书籍信息(POST /books)
- 更新书籍信息(PUT /books/{id})
- 删除指定ID书籍信息(DELETE /books/{id})
对于URL的定义形式,我们采用了REST ful规范:[RESTful API 一种流行的 API 设计风格](http://www.restfulapi.nl/)。
Web应用启动
最后,我们编写一个启动类启动我们的书籍管理Web服务:
@SpringBootApplication
public class BookManagementSystemApp {
public static void main(String[] args) {
SpringApplication.run(BookManagementSystemApp.class, args);
}
}
功能验证
通过postman等HTTP API工具,我们可以轻松的验证我们的API的正确性。本人也把该处的postman调用文件导出存放在了项目/guide/postman/目录下,同学可以用postman导入使用。
极简SpringBoot指南-Chapter04-基于SpringBoot的书籍管理Web服务的更多相关文章
- 黑科技抢先尝(续2) - Windows terminal中Powershell Tab的极简美化指南
目录 安装python 安装git 安装powerline字体 主题定制 安装oh-my-posh 查看策略组的执行权限 使用choco 安装终端模拟器 - ConEmu 优化 PowerShell ...
- 极简SpringBoot指南-Chapter03-基于SpringBoot的Web服务
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- 极简SpringBoot指南-Chapter00-学习SpringBoot前的基本知识
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- 《Springboot极简教程》问题解决:Springboot启动报错 Whitelabel Error Page: This application has no explicit mapping for(转)
13.2 Spring Boot启动报错:Whitelabel Error Page 13.2 Spring Boot启动报错:Whitelabel Error Page 问题描述 Whitelabe ...
- 黑科技抢先尝(续) - Windows terminal中WSL Linux 终端的极简美化指南
目录 修改默认源,为apt-get安装提速 安装python 和 python pip 安装 zsh 安装powerline-font中的特定字体 安装powerline-shell 修改~目录下的配 ...
- 基于Apache axis2开发Java Web服务
1.安装配置axis2环境 1)下载axis2-1.4.1-war(发布webservice)和axis2-1.4.1-bin.zip(webservice调用使用的各种包) 下载好后把axis2-1 ...
- Docker笔记三:基于LVS DR模式构建WEB服务集群
安装ipvsadm 1. 先在宿主机上安装并以root来启动ipvsadm,每次要在容器中运行ipvs都需要先在宿主机上启动ipvs.如果直接进行2步操作将报出如下错误: Can't initiali ...
- 极简SpringBoot指南-Chapter05-SpringBoot中的AOP面向切面编程简介
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- 极简SpringBoot指南-Chapter02-Spring依赖注入的方式
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
随机推荐
- git rebase和git merge的区别
前言: 平时工作中发现一般同事在同步远程代码的时候都是用git pull,其实git pull包含有两个操作,一个是fetch远程的代码,一个是将本地当前的代码和远程代码进行merge,即git ...
- 高德渲染网关Go语言重构实践
1.导读 高德启动Go业务建设已经有段时间了,主要包含Go应用落地,Go中间件建设,云原生三个部分.经过持续的发力,在这些方面取得了不错的进展.高德Go业务落地过程是如何实现的,遇到过哪些问题,如何 ...
- T-SQL - query03_去重查询|模糊查询|排序|分组|使用函数
时间:2017-09-29 整理:byzqy 本篇仍以"梁山好汉"数据表为例,介绍几个常用的 T-SQL 查询语句: 去重查询,关键字:distinct 使用通配符模糊查询,关键字 ...
- C# - 习题05_写出程序的输出结果o1.count
时间:2017-08-24 整理:byzqy 题目:写出下列程序的输出结果: //原题程序如下: class Class1 { private static int count = 0; static ...
- leaflet加载离线OSM(OpenStreetMap)
本文为博主原创,如需转载需要署名出处. leaflet作为广为应用的开源地图操作的API,是非常受欢迎,轻量级的代码让使用者更容易操作. 废话不多说,下面直接给出范例. 首先在这个网站下载leafle ...
- Java调用腾讯云短信接口,完成验证码的发送(不成功你来砍我!!)
一.前言 我们在一些网站注册页面,经常会见到手机验证码的存在,这些验证码一般的小公司都是去买一些大的厂家的短信服务,自己开发对小公司的成本花费太大了!今天小编就带着大家来学习一下腾讯云的短信接口,体验 ...
- Shiro02
Shiro认证 Pom依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>s ...
- shell运算方式
1.(())--整数运算 [root@m01 /server/scripts]# a=1 [root@m01 /server/scripts]# b=2 [root@m01 /server/scrip ...
- TypeScript 中装饰器的理解?应用场景?
一.是什么 装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上 是一种在不改变原类和使用继承的情况下,动态地扩展对象功能 同样的,本质也不是什么高大上的结构,就是一个普通的 ...
- 在linux查询本机的公网IP
linux服务器查看公网IP信息的方法 最近在解决网络问题时,需要查看本机的出口公网IP信息,所以在网络上搜索和请求运维达人,获得如下两个方法: curl ifconfig.me 在linux系统中输 ...