基于SpringBoot打造RESTful API实战指南

 更新时间:2025年12月12日 10:26:44   作者:中文很快乐  
本文详细介绍了RESTful API的基本概念、设计规范以及与非RESTful风格的对比,通过Spring Boot实战部分,展示了如何实现一个简单的RESTful API,需要的朋友可以参考下

一、什么是 RESTful API?

REST(Representational State Transfer)是一种 面向资源 的架构风格,核心思想:

用 URL 定位资源,用 HTTP 动词描述操作

面向资源怎么理解呢?:

RESTful API 就是符合 REST 约束的接口,特点:

  • 无状态(每次请求自带上下文)
  • 统一接口(GET/POST/PUT/DELETE)
  • 资源导向(URL 是名词,不是动词)

二、设计规范

2.1 controller接口设计规范

RESTful API的RequestMapping的方式有4种,以图书为例,每一种的应用场景如下:

动作资源集合 /books单个资源 /books/{id}
GET查询集合查询单个
POST新增集合
PUT批量更新更新单个
DELETE批量删除删除单个

2.2 返回结构设计规范

字段类型说明
codeintHTTP 状态码(200/400/404/500)
messagestring用户可读提示信息
data泛型T业务数据(含分页)

三、restful与非restful风格对比

3.1查询图书

非 RESTful 代码:

@GetMapping("/getBook")
public List<Book> getBooks(@RequestParam int page,@RequestParam int size) {
    return bookService.list(page,size);   // 直接 List
}

RESTful 代码:

@GetMapping("/book")
public ApiResponse<PageVO<Book>> list(@RequestParam(defaultValue = "1") int page,@RequestParam(defaultValue = "10") int size) {
    return ApiResponse.success(PageVO.of(bookService.list(page,size)));
}

对比表格:

纬度非 RESTfulRESTful
URL/getBook.php?page=1&size=20/book?page=1&size=20
HTTPGETGET
返回List<Book>ApiResponse<PageVO<Book>>
状态码200(包一切)200(正常)
示例返回[{...}, {...}]{code:200,data:{records:[...],total:90}}

3.2 新增图书

非 RESTful 代码:

@PostMapping("/addBook")
public Book addBook(@RequestBody Book book) {
    return bookService.create(book);   // 直接实体
}

RESTful 代码:

@PostMapping("/book")
@ResponseStatus(HttpStatus.CREATED)
public ApiResponse<Book> create(@Valid @RequestBody Book book) {
    return ApiResponse.success(bookService.create(book));
}

对比表格:

纬度非 RESTfulRESTful
URL/addBook.php/book
HTTPPOSTPOST
返回BookApiResponse<Book>
状态码200(包一切)201(Created)
示例返回{...}{code:200,data:{}}

3.3 修改图书

非 RESTful 代码:

    @PostMapping("/updateBook")
    public Book update(@Valid @RequestBody Book book) {
           //处理修改逻辑
        return book;
    }

RESTful 代码:

    @PutMapping("/book")
    public ApiResponse<Book> update(@Valid @RequestBody Book book) {
           //处理修改逻辑
        return ApiResponse.success(book);
    }

对比表格:

纬度非 RESTfulRESTful
URL/updateBook.php/book
HTTPPOSTPUT
返回BookApiResponse<Book>
示例返回{...}{code:200,data:{}}

3.4 删除图书

非 RESTful 代码:

@GetMapping("/deleteBook")
public String deleteBook(@RequestParam Long id) {
    bookService.delete(id);
    return "删除成功";   // 字符串
}

RESTful 代码:

@DeleteMapping("/book/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public ApiResponse<String> delete(@PathVariable Long id) {
    bookService.deleteById(id);
    return ApiResponse.success("删除成功");
}

对比表格:

纬度非 RESTfulRESTful
URL/deleteBook.php?id=1/book/1
HTTPGET(❌)DELETE
返回String("删除成功")ApiResponse<String>

从上述可以看出,使用restful风格,增删查改接口的url可以命名相同/book,因为是根据不同的方式(GET、POST、PUT、DELETE)来区分的。

四、SpringBoot 实战

4.1 前提准备实体类

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Book {
    private Long id;
    private String name;
    private BigDecimal price;
}

4.2 restful返回规范

@Data
public class ApiResponse<T> {
    private int code;
    private String message;
    private T data;

    public static <T> ApiResponse<T> success(T data) {
        ApiResponse<T> resp = new ApiResponse<>();
        resp.code = 200;
        resp.message = "success";
        resp.data = data;
        return resp;
    }
}

4.3 Controller类(RESTful 核心)

@RestController
@RequestMapping("/books")
@Validated
public class BookController {

    private final Map<Long, Book> repo = new ConcurrentHashMap<>();

    // 查询集合
    @GetMapping
    public ApiResponse<List<Book>> list(@RequestParam(required = false) String name) {
        List<Book> list = repo.values().stream()
                .filter(b -> name == null || b.getName().contains(name))
                .collect(Collectors.toList());
        return ApiResponse.success(list);
    }

    // 查询单个
    @GetMapping("/{id}")
    public ApiResponse<Book> get(@PathVariable Long id) {
        Book book = Optional.ofNullable(repo.get(id))
                .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
        return ApiResponse.success(book );
    }

    // 新增
    @PostMapping
    public ApiResponse<Book>create(@Valid @RequestBody Book book) {
        book.setId(System.currentTimeMillis());
        repo.put(book.getId(), book);
        return ApiResponse.success(list);
    }

    // 全量更新
    @PutMapping("/{id}")
    public ApiResponse<Book> update(@PathVariable Long id, @Valid @RequestBody Book book) {
           //自定义更新逻辑
        return ApiResponse.success(list);
    }

    // 删除
    @DeleteMapping("/{id}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public ApiResponse<?> delete(@PathVariable Long id) {
        return ApiResponse.success(repo.remove(id));
    }
}

4.4 请求示例

GET    /books        → 查询图书列表
GET    /books/1      → 查询 id=1 的图书
POST   /books        → 新增图书
PUT    /books/1      → 全量更新 id=1 的图书
DELETE /books/1      → 删除 id=1 的图书

以上就是基于SpringBoot打造RESTful API实战指南的详细内容,更多关于SpringBoot打造RESTful API的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot整合MyBatis和SpringBoot整合MyBatis-Plus教程

    SpringBoot整合MyBatis和SpringBoot整合MyBatis-Plus教程

    这篇文章主要介绍了SpringBoot整合MyBatis和SpringBoot整合MyBatis-Plus教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • Idea如何关闭或开启引用提示Usages和Annotations

    Idea如何关闭或开启引用提示Usages和Annotations

    这篇文章主要介绍了Idea如何关闭或开启引用提示Usages和Annotations问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • springboot CommandLineRunner接口实现自动任务加载功能

    springboot CommandLineRunner接口实现自动任务加载功能

    这篇文章主要介绍了springboot CommandLineRunner接口实现自动任务加载功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • python和java哪个学起来更简单

    python和java哪个学起来更简单

    在本篇内容里小编给大家分享的是一篇关于python和java哪个学起来更简单的相关内容,有兴趣的朋友们参考下。
    2020-06-06
  • Java 高并发六:JDK并发包2详解

    Java 高并发六:JDK并发包2详解

    本文主要介绍Java高并发这里整理了详细资料,并讲解了 1. 线程池的基本使用 2. 扩展和增强线程池 3. ForkJoin的知识,有兴趣的小伙伴可以参考下
    2016-09-09
  • Java实现贪吃蛇大作战小游戏的示例代码

    Java实现贪吃蛇大作战小游戏的示例代码

    本文主要介绍了Java实现贪吃蛇大作战小游戏的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • servlet创建web后端程序的示例代码

    servlet创建web后端程序的示例代码

    本文主要介绍了servlet创建web后端程序的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 浅谈synchronized加锁this和class的区别

    浅谈synchronized加锁this和class的区别

    synchronized 是 Java 语言中处理并发问题的一种常用手段,本文主要介绍了synchronized加锁this和class的区别,具有一定的参考价值,感兴趣的可以了解一下
    2021-11-11
  • Java正则表达式的语法及示例解析

    Java正则表达式的语法及示例解析

    这篇文章主要介绍了Java正则表达式的语法及示例解析,需要的朋友可以参考下
    2017-07-07
  • IDEA实用好用插件推荐及使用方法教程详解(必看)

    IDEA实用好用插件推荐及使用方法教程详解(必看)

    这篇文章主要介绍了IDEA实用好用插件推荐及使用方法教程,本文通过实例截图相结合给大家介绍的非常详细,对大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04

最新评论