<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>SHEN LI</title><description>后端开发者 / AI 应用探索者 · 马来亚大学计算机科学（人工智能）在读（预计 2028.3 毕业）</description><link>https://shenli.online</link><item><title>使用 Spring Boot 构建 RESTful API 的最佳实践</title><link>https://shenli.online/blog/20260615-spring-boot-api-practices/post</link><guid isPermaLink="true">https://shenli.online/blog/20260615-spring-boot-api-practices/post</guid><description>分享我在项目中总结的 Spring Boot RESTful API 设计经验，包括统一响应格式、全局异常处理、参数校验和 API 版本管理。</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;在过去的一年里，我参与了多个基于 Spring Boot 的后端项目开发，逐渐积累了一些关于 RESTful API 设计的经验。本文总结了一些我认为比较重要的实践。&lt;/p&gt;
&lt;h2&gt;1. 统一响应格式&lt;/h2&gt;
&lt;p&gt;无论是在开发还是调试阶段，一个统一的响应格式都能大大降低沟通成本。我习惯使用如下结构：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;code&quot;: 200,
  &quot;message&quot;: &quot;success&quot;,
  &quot;data&quot;: {}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对应 Java 实现：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Data
public class ApiResponse&amp;#x3C;T&gt; {
    private Integer code;
    private String message;
    private T data;

    public static &amp;#x3C;T&gt; ApiResponse&amp;#x3C;T&gt; success(T data) {
        ApiResponse&amp;#x3C;T&gt; response = new ApiResponse&amp;#x3C;&gt;();
        response.setCode(200);
        response.setMessage(&quot;success&quot;);
        response.setData(data);
        return response;
    }

    public static &amp;#x3C;T&gt; ApiResponse&amp;#x3C;T&gt; error(Integer code, String message) {
        ApiResponse&amp;#x3C;T&gt; response = new ApiResponse&amp;#x3C;&gt;();
        response.setCode(code);
        response.setMessage(message);
        return response;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. 全局异常处理&lt;/h2&gt;
&lt;p&gt;借助 &lt;code&gt;@RestControllerAdvice&lt;/code&gt; 和 &lt;code&gt;@ExceptionHandler&lt;/code&gt;，可以优雅地集中处理异常：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ApiResponse&amp;#x3C;?&gt; handleValidation(MethodArgumentNotValidException ex) {
        String msg = ex.getBindingResult().getFieldErrors()
            .stream()
            .map(e -&gt; e.getField() + &quot;: &quot; + e.getDefaultMessage())
            .collect(Collectors.joining(&quot;, &quot;));
        return ApiResponse.error(400, msg);
    }

    @ExceptionHandler(Exception.class)
    public ApiResponse&amp;#x3C;?&gt; handleException(Exception ex) {
        return ApiResponse.error(500, &quot;服务器内部错误&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. 参数校验&lt;/h2&gt;
&lt;p&gt;Spring Boot 内置了 Bean Validation，配合 &lt;code&gt;@Valid&lt;/code&gt; 注解可以很方便地做参数校验：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RestController
@RequestMapping(&quot;/api/users&quot;)
public class UserController {

    @PostMapping
    public ApiResponse&amp;#x3C;User&gt; create(@Valid @RequestBody CreateUserRequest request) {
        // 业务逻辑
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4. API 版本管理&lt;/h2&gt;
&lt;p&gt;推荐将版本号放在 URL 路径中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/api/v1/users&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/api/v2/users&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样在需要不兼容升级时，可以平滑过渡。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;以上就是我在实际项目中使用 Spring Boot 构建 RESTful API 时的一些实践。好的 API 设计应该在项目初期就确定好规范，避免后期返工。希望对你有所帮助。&lt;/p&gt;</content:encoded></item></channel></rss>