Skip to content
ADP
API Design PrincipleBETA

[ADP-312] 分頁

reviewing phase 1

更正 OpenAPI 範例

概述

RESTful API 中的分頁是一種將大型數據集分割成更小、更易管理的塊或"頁面"的技術。這有助於提高性能、減少服務器負載並提供更好的用戶體驗。

分頁主要有兩種方法:基於偏移的分頁和基於游標的分頁。

基於偏移的分頁

基於偏移的分頁使用偏移值來指定數據集的起始點,並使用限制來指定要檢索的項目數。

示例

http
GET /resources?offset=20&limit=10 HTTP/1.1
http
{
  "resources": [ /* 從偏移量20到29的資源 */ ],
  "meta": {
    "offset": 20,
    "limit": 10,
    "totalItems": 100
  },
  "links": {
    "self": "/resources?offset=20&limit=10",
    "next": "/resources?offset=30&limit=10",
    "prev": "/resources?offset=10&limit=10",
    "first": "/resources?offset=0&limit=10",
    "last": "/resources?offset=90&limit=10"
  }
}

WARNING

此處使用 HATEOAS 提供上下頁連結,但是 HATEOAS 在本指導原則中並不推薦使用。

基於游標的分頁

基於游標的分頁使用游標(通常是唯一標識符)來獲取下一組結果。

示例

http
GET /resources?cursor=abc123&limit=10 HTTP/1.1
http
{
  "data": [ /* 從游標abc123之後開始的資源 */ ],
  "meta": {
    "next_cursor": "def456",
    "limit": 10
  },
  "links": {
    "self": "/resources?cursor=abc123&limit=10",
    "next": "/resources?cursor=def456&limit=10"
  }
}

WARNING

此處使用 HATEOAS 提供上下頁連結,但是 HATEOAS 在本指導原則中並不推薦使用。

指導原則

  • 應該(SHOULD)選擇分頁約定並使用常見的查詢參數進行分頁。目前基於游標的分頁更為常見。

  • 應該(SHOULD)使用常見的查詢參數(query parameters)來做分頁,即:cursor, offset, limit

  • 應該(SHOULD)在回應標頭中提供下一頁/上一頁的鏈接,詳情參見ADP-145: Link

    http
    Link: <https://api.example.com/resources?cursor=test123>; rel="next",
          <https://api.example.com/resources?cursor=test123>; rel="prev",

示例

OpenAPI 示例

http
openapi: 3.1.0
info:
  title: 示例 API
  version: 1.0.0
paths:
  /resources:
    get:
      summary: 獲取資源列表
      parameters:
        - name: page
          in: query
          description: 分頁的頁碼
          required: false
          schema:
            type: integer
        - name: filter
          in: query
          description: 過濾條件
          required: false
          schema:
            type: string
        - name: sort
          in: query
          description: 排序順序
          required: false
          schema:
            type: string
      responses:
        '200':
          description: 分頁的資源列表
          headers:
            Link:
              description: 分頁鏈接
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                properties:
                  resources:
                    type: array
                    items:
                      type: object
                  total:
                    type: integer
                  page:
                    type: integer
                  pageSize:
                    type: integer

參考

規範參考

設計參考