基于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的资料请关注脚本之家其它相关文章!

相关文章

  • java如何写接口给别人调用的示例代码

    java如何写接口给别人调用的示例代码

    这篇文章主要介绍了java如何写接口给别人调用的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • JAVA实现经典扫雷游戏的示例代码

    JAVA实现经典扫雷游戏的示例代码

    windows自带的游戏《扫雷》是陪伴了无数人的经典游戏,本程序参考《扫雷》的规则进行了简化,用java语言实现,采用了swing技术进行了界面化处理。感兴趣的可以学习一下
    2022-01-01
  • RocketMQ消息积压原因及处理方法

    RocketMQ消息积压原因及处理方法

    RocketMQ是一种可靠的、可扩展的消息中间件,广泛应用于分布式系统中的消息通信,然而,在高并发的场景下,由于消息产生速度超过消费速度,可能会导致消息积压的问题,本文将介绍RocketMQ消息积压的原因和如何处理积压问题
    2023-06-06
  • Java 编程中十个处理异常的建议

    Java 编程中十个处理异常的建议

    这篇文章主要介绍了Java 编程中十个处理异常的建议,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Mybatis的parameterType造成线程阻塞问题分析

    Mybatis的parameterType造成线程阻塞问题分析

    这篇文章主要详细分析了Mybatis的parameterType造成线程阻塞问题,文中有详细的解决方法,及相关的代码示例,具有一定的参考价值,感兴趣的朋友可以借鉴阅读
    2023-06-06
  • SpringBoot项目中org.junit.jupiter.api.Test报错问题及解决

    SpringBoot项目中org.junit.jupiter.api.Test报错问题及解决

    这篇文章主要介绍了SpringBoot项目中org.junit.jupiter.api.Test报错问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • SpringBoot资源文件的存放位置设置方式

    SpringBoot资源文件的存放位置设置方式

    这篇文章主要介绍了SpringBoot资源文件的存放位置设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring Boot + Mybatis Plus实现树状菜单的方法

    Spring Boot + Mybatis Plus实现树状菜单的方法

    这篇文章主要介绍了Spring Boot + Mybatis Plus实现树状菜单,包括实体类中添加子菜单列表和集合及构建菜单树的详细代码,代码简单易懂,需要的朋友可以参考下
    2021-12-12
  • mybatis 忽略实体对象的某个属性(2种方式)

    mybatis 忽略实体对象的某个属性(2种方式)

    这篇文章主要介绍了mybatis 忽略实体对象的某个属性方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Spring反射内置工具类ReflectionUtils用法及说明

    Spring反射内置工具类ReflectionUtils用法及说明

    这段文章主要介绍了Java反射机制及其在获取sentinel熔断规则map和操作类属性方法中的应用,通过JDK和Spring的ReflectionUtils展示了如何优雅地处理反射操作,提升代码的可阅读性和维护性
    2026-06-06

最新评论