Spring Boot RESTful API 設計指南:查詢接口規范與最佳實踐

Spring Boot RESTful API 設計指南:查詢接口規范與最佳實踐

引言

在 Spring Boot 開發中,查詢接口的設計直接影響著系統的可用性、可維護性和性能。本文將深入探討如何規范設計查詢接口,包括 GET/POST 的選擇、參數定義、校驗規則等,并提供可落地的代碼示例。

一、GET 與 POST 的選擇標準

1.1 何時使用 GET 請求

GET 請求是冪等的,適合用于不修改服務器狀態的查詢操作:

// 商品列表查詢示例
@GetMapping("/products")
public ResponseEntity<Page<Product>> queryProducts(@RequestParam(required = false) String name,@RequestParam(required = false) String category,@RequestParam(defaultValue = "0") int page,@RequestParam(defaultValue = "10") int size) {// 分頁查詢邏輯
}

優勢

  • 可被緩存
  • 參數可見,便于調試
  • 支持瀏覽器直接訪問

限制

  • URL 長度有限(約 2048 字符)
  • 參數只能簡單鍵值對

1.2 何時使用 POST 請求

當查詢條件復雜時,POST 更合適:

// 復雜商品搜索示例
@PostMapping("/products/search")
public ResponseEntity<Page<Product>> searchProducts(@RequestBody ProductSearchDTO searchDTO) {// 復雜查詢邏輯
}// 搜索DTO定義
@Data
public class ProductSearchDTO {private String keyword;private List<String> categories;private PriceRange priceRange;private SortCondition sort;@Datapublic static class PriceRange {private BigDecimal min;private BigDecimal max;}
}

適用場景

  • 參數包含嵌套對象
  • 需要傳遞數組/集合
  • 查詢條件超過 10 個字段
  • 涉及敏感數據(如身份證號查詢)

二、參數設計規范

2.1 基礎查詢參數

推薦格式

@GetMapping("/orders")
public Page<Order> queryOrders(@RequestParam @DateTimeFormat(iso = ISO.DATE) LocalDate startDate,@RequestParam @DateTimeFormat(iso = ISO.DATE) LocalDate endDate,@RequestParam(defaultValue = "0") @Min(0) int page,@RequestParam(defaultValue = "20") @Max(100) int size) {// 查詢邏輯
}

規范要點

  1. 時間參數明確格式(推薦 ISO 8601)
  2. 分頁參數統一命名(page/size)
  3. 添加基礎校驗注解

2.2 復雜查詢參數

標準DTO示例

@Data
public class AdvancedSearchDTO {@NotBlankprivate String queryType; // 搜索類型:精確/模糊@Size(max = 10)private List<@Pattern(regexp = "^[A-Za-z0-9]+$") String> codes;@Validprivate TimeRange createTime;@Datapublic static class TimeRange {@PastOrPresentprivate LocalDateTime start;@FutureOrPresentprivate LocalDateTime end;}
}

Controller使用

@PostMapping("/data/advanced-search")
public SearchResult advancedSearch(@Valid @RequestBody AdvancedSearchDTO dto) {// 參數自動校驗
}

三、高級設計模式

3.1 動態查詢實現

方案一:QueryDSL 動態查詢

@GetMapping("/dynamic")
public List<User> dynamicQuery(@RequestParam(required = false) String name,@RequestParam(required = false) Integer age) {BooleanBuilder builder = new BooleanBuilder();if (name != null) {builder.and(user.name.contains(name));}if (age != null) {builder.and(user.age.eq(age));}return queryFactory.selectFrom(user).where(builder).fetch();
}

方案二:Specification 動態查詢

@PostMapping("/spec-search")
public Page<User> specSearch(@RequestBody UserSpecification spec,Pageable pageable) {return userRepository.findAll(spec, pageable);
}

3.2 全局參數處理

統一分頁參數處理

@ControllerAdvice
public class PaginationAdvice implements WebMvcConfigurer {@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(new PageableHandlerMethodArgumentResolver() {@Overridepublic Pageable resolveArgument(...) {Pageable pageable = super.resolveArgument(...);return PageRequest.of(pageable.getPageNumber(),Math.min(pageable.getPageSize(), 100),pageable.getSort());}});}
}

四、安全與性能優化

4.1 安全規范

  1. 敏感參數處理

    @PostMapping("/secure-search")
    public ResponseEntity<?> secureSearch(@Encrypted @RequestBody SensitiveSearchDTO dto) {// 自動解密處理
    }
    
  2. SQL 注入防護

    • 使用 JPA/Hibernate 參數綁定
    • 禁止字符串拼接 SQL

4.2 性能優化

  1. 分頁最佳實踐

    @GetMapping("/optimized")
    public Slice<Data> optimizedQuery(Pageable pageable,@RequestParam String filter) {return repository.findByFilter(filter, PageRequest.of(pageable.getPageNumber(),Math.min(pageable.getPageSize(), 50)));
    }
    
  2. 響應壓縮

    # application.properties
    server.compression.enabled=true
    server.compression.mime-types=application/json
    

五、文檔化與測試

5.1 Swagger 集成

@Operation(summary = "用戶復雜查詢")
@PostMapping("/users/advanced-search")
public Page<User> advancedUserSearch(@Parameter(description = "查詢條件", required = true)@RequestBody UserSearchDTO dto,@Parameter(description = "分頁參數")Pageable pageable) {// 實現邏輯
}

5.2 測試用例

MockMVC 測試示例

@Test
void testQueryWithParams() throws Exception {mockMvc.perform(get("/api/products").param("category", "electronics").param("page", "0").param("size", "10")).andExpect(status().isOk()).andExpect(jsonPath("$.content").isArray());
}

結語

良好的查詢接口設計需要平衡以下因素:

  1. 語義明確:準確表達接口用途
  2. 參數規范:統一命名和結構
  3. 安全可靠:防止注入和越權
  4. 性能高效:合理分頁和緩存
  5. 易于維護:完善的文檔和測試

建議團隊制定統一的《接口設計規范》,并使用 Swagger 等工具維護接口文檔。實際開發中應根據業務場景靈活選擇技術方案,避免教條主義。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88740.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88740.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88740.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ctfshow萌新題集

記錄一下前半部分是能自己寫出來的&#xff0c;后半部分是需要提示的&#xff0c;感覺自己歸來兩年仍是萌新 misc部分 知識點 base家族密文特征 Base16 (Hex) 字符集&#xff1a;0-9, A-F&#xff08;不區分大小寫&#xff09;。特征&#xff1a; 長度是 2 的倍數&#xff…

2025年語言處理、大數據與人機交互國際會議(DHCI 2025)

&#x1f310;&#x1f916;&#x1f9e0; 語言處理、大數據與人機交互&#xff1a;探索智能未來 —— DHCI 2025國際會議2025年語言處理、大數據與人機交互國際會議&#xff08;DHCI 2025&#xff09; 將于2025年在中國重慶市召開。這次盛會將匯聚全球頂尖專家、學者及行業領袖…

RIP實驗以及核心原理

RIP&#xff08;Routing Information Protocol&#xff0c;路由信息協議&#xff09;是一種內部網關協議&#xff0c;基于距離矢量算法&#xff0c;用于在自治系統內交換路由信息。RIP 核心原理距離矢量算法&#xff1a;RIP 使用跳數作為路徑選擇的唯一度量標準。每經過一個路由…

基于大數據的電力系統故障診斷技術研究

摘要本文提出了一種創新性的基于大數據技術的電力系統故障診斷方法&#xff0c;該方法通過整合先進的機器學習算法和交互式可視化技術&#xff0c;實現了對電力系統各類故障的智能化識別與深度分析。該系統采用隨機森林算法作為核心分類器&#xff0c;構建了高精度的故障分類模…

MySQL 分區功能應用專門實現全方位詳解與示例

MySQL 分區功能允許將表的數據分散存儲在不同的物理分區中,同時保持邏輯上的單一表結構。下面我將從基礎概念到高級應用,全面講解 MySQL 分區實現。 一、分區核心作用 1. 性能提升 分區剪枝(Partition Pruning):查詢時自動跳過不相關的分區,減少數據掃描量 并行處理:不…

汽車功能安全-嵌入式軟件測試(軟件合格性測試)【目的、驗證輸入、集成驗證要求】11

文章目錄1 嵌入式軟件測試&#xff08;Testing of the embedded Software&#xff09;2 測試輸入3 驗證要求和建議3.1 測試環境3.2 測試方法3.2.1 基于需求的測試3.2.2 故障注入測試3.2.3 兩種方法的區別與聯系總結3.3 測試用例導出方法4 嵌入式軟件的測試結果評價5 測試輸出物…

【webrtc】gcc當前可用碼率1:怎么決策的

【webrtc】當前最大碼率是怎么決策的1 看日志,跟蹤代碼最大碼率 是probe的上限 默認值很大 外部設置的較小,調用堆棧 無限大作為默認值 默認是無限大,所以使用預設值 【webrtc】碼率設定中的 int64_t 的無限大

UE5 C++計時器

UE5 C計時器 計時器一&#xff1a; .h文件 FTimerHandle TimerHandle_BetweenShot;//定義時間句柄 void StartFire();void EndFire();.cpp文件 #include “TimerManager.h” void ASpaceShip::StartFire() {GetWorldTimerManager().SetTimer(TimerHandle_BetweenShot, this, &a…

【hivesql 已知維度父子關系加工層級表】

這里寫自定義目錄標題1. 維度表示例1.1清單表1.2層級表2.從清單表加工層級表2.1 注意點2.2 加工方式&#xff08;join&#xff09;2.3 使用函數3.清單表字段加工3.1通過上級編碼信息加工級別信息3.2 通過級別信息&#xff0c;加工上級編碼信息4.創建維度表的一般注意點1. 維度表…

Ubuntu重裝系統后ssh連接不上(遇到 ??“Unit ssh.service not found“?? 錯誤)

重裝系統時不知道為什么SSH 服務未安裝&#xff0c;以下是解決方案&#xff1a;先檢查ssh服務安裝沒安裝 sudo systemctl status ssh # Ubuntu/Debian如果 systemctl 找不到服務&#xff0c;可能是 SSH 未安裝&#xff1a;sudo apt update sudo apt install openssh-serve…

2025社交電商新風口:推客小程序的商業邏輯與技術實現

一、推客小程序市場前景與商業價值在當今社交電商蓬勃發展的時代&#xff0c;推客小程序已成為連接商家與消費者的重要橋梁。推客模式結合了社交傳播與電商變現的雙重優勢&#xff0c;通過用戶自發分享帶來裂變式增長&#xff0c;為商家創造了全新的營銷渠道。推客小程序的核心…

Go 單元測試進階:AI 加持下的高效實踐與避坑指南

單元測試的必要性與基礎單元測試不僅是保障代碼質量的手段&#xff0c;也是優秀的設計工具和文檔形式&#xff0c;對軟件開發具有重要意義。另一種形式的文檔&#xff1a;好的單元測試是一種活文檔&#xff0c;能清晰展示代碼單元的預期用途和行為&#xff0c;有時比注釋更有用…

VScode SSH遠程連接Ubuntu(通過SSH密鑰對的方式)

我們都知道在VScode上通過SSH插件的方式可以遠程連接到虛擬機的Ubuntu系統&#xff0c;這樣開發者就可以在Windows下的Vscode編譯器下直接遠程連接Ubuntu&#xff0c;這種方式是 “用 Windows 的便捷性操作 Linux 的專業性”—— 既保留了Windows系統的易用性和VS Code的強大功…

學術繪圖(各種神經網絡)

23種神經網絡設計&可視化工具匯總 下面做簡要羅列&#xff0c;具體請看相關鏈接 1.draw_convnet Github: https://github.com/gwding/draw_convnet? star 數量&#xff1a;1.7k? 這個工具最后一次更新是2018年的時候&#xff0c;一個Python腳本來繪制卷積神經網絡的工…

Redis的高可用性與集群架構

Redis的高可用性與集群架構 引言&#xff1a;解釋高可用性的重要性及Redis如何實現主從復制&#xff08;Replication&#xff09; 原理&#xff1a;異步復制&#xff0c;主從數據同步配置方法優缺點分析 哨兵模式&#xff08;Sentinel&#xff09; 功能&#xff1a;監控、通知、…

TCP的連接

TCP 三次握手過程是怎樣的&#xff1f;TCP 是面向連接的協議&#xff0c;所以使用 TCP 前必須先建立連接&#xff0c;而建立連接是通過三次握手來進行的。三次握手的過程如下圖&#xff1a;一開始&#xff0c;客戶端和服務端都處于 CLOSE 狀態。先是服務端主動監聽某個端口&…

Excel的學習

一、熟悉界面 1.功能區 點擊“視圖”,點擊凍結窗格,選擇目標行 2.表格區 3.自定義功能區 在上面的空白編輯欄處,右鍵選擇自定義功能區 4.數據輸入規范 (1)格式不統一(日期格式不規范,姓名亂加空格,亂合并單元格) 姓名對齊:右鍵選擇編輯單元格格式,選擇對齊,…

論文閱讀:HybridTrack: A Hybrid Approach for Robust Multi-Object Tracking

論文地址:2501.01275v2 代碼地址:GitHub - leandro-svg/HybridTrack: [RA-L25/ICRA26] HybridTrack: A Hybrid Approach for Robust Multi-Object Tracking 前言 多目標跟蹤旨在在幀間檢測和關聯所有所需的目標。大多數方法通過明確或隱式地利用強大的線索(即空間和外觀信…

EtherCAT開源主站 SOEM 2.0 最新源碼在嵌入式 Linux 下的移植與編譯

EtherCAT 作為工業自動化領域的主流現場總線協議&#xff0c;因其高實時性和高帶寬被廣泛應用。而 SOEM&#xff08;Simple Open EtherCAT Master&#xff09;則是開源社區中最受歡迎的 EtherCAT 主站協議棧之一。本文將以 SOEM 2.0 最新源碼為例&#xff0c;詳細介紹其在嵌入式…