极简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 ...
 
随机推荐
- linux0.01内核源码结构
			
目录 boot 系统引导. fs 文件系统. include 头文件.一些C标准库,系统核心库. init 入口.main.c. kernel 内核. lib 库.C源程序,一些基本核心的程序. mm ...
 - git 使用代理出现 LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443 错误
			
删除代理即可. 具体操作如下: 1. git config --global --list 查看git配置 发现其中有 http.https.XXXXXX.proxy 和 https.http ...
 - JOB状态与并发
			
由于job每次被执行时都会创建一个新的实例, jobDetail实例时,要进行数据存储或者,特殊字段操作,需要每次schedul执行job时保留之前的数据, 那么就需要job在有状态下保持之前的数据信 ...
 - ROS入门学习(基于Ubuntu16.04+kinetic)
			
本文主要部分全部来源于ROS官网的Tutorials. Setup roscore # making sure that we have roscore running rosrun turtlesi ...
 - HCNP Routing&Switching之OSPF外部路由类型以及forwarding address
			
前文我们了解了OSPF的4类.5类LSA,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15222969.html:今天我们来聊一聊外部路由类型和forward ...
 - Python面向对象编程及内置方法
			
在程序开发中,要设计一个类,通常需要满足以下三个要求: [1]类名 这类事物的名字,满足大驼峰命名法 [2]属性 这类事物具有什么样的特征 [3]方法 这类事物具有什么样的行为 定义简单的类: 定义只 ...
 - 小程序 读取照片 EXIF 元信息
			
安装 exif.js npm install exif-js --save UI <button type="primary" @click="onExif&quo ...
 - Python - break、continue 的使用
			
前置知识 break.continue 会结合循环使用的,所以要先学会循环哦 python 提供了两种循环语句 for 循环:https://www.cnblogs.com/poloyy/p/1508 ...
 - Spring-图解
 - call、apply、bind三者比较
			
var obj={a:1}; var foo={ getA:function(item1,item2){ return this.a+item1+item2 } } // apply绑定参数为数组,一 ...