cover

概念圖

API 文件用嘴巴講、用 Word 寫、用 Slack 傳——然後前端照著做完發現跟實際 API 對不上。Swagger 的存在就是為了終結這種悲劇。

先講結論

Swagger(現在叫 OpenAPI)是 API 文件的業界標準。它不只是文件——它是可以互動的文件,前端可以直接在上面測 API、看 response 格式、甚至自動產生 client code。如果你的團隊還在用 Google Sheet 記 API 格式,是時候升級了。

Swagger 到底是什麼

2016 年之後,規範部分改名為 OpenAPI Specification (OAS),Swagger 變成工具的品牌名稱。但大家還是習慣叫 Swagger,你懂就好。

整個生態系長這樣:

  • OpenAPI Spec:用 YAML/JSON 描述你的 API 長什麼樣
  • Swagger UI:把 spec 渲染成漂亮的互動式文件
  • Swagger Editor:線上編輯 spec
  • Swagger Codegen:從 spec 自動產生前端 / 後端程式碼

一份 OpenAPI Spec 長怎樣

openapi: 3.0.0
info:
  title: 使用者 API
  version: 1.0.0
 
paths:
  /users:
    get:
      summary: 取得使用者列表
      parameters:
        - name: page
          in: query
          schema:
            type: integer
            default: 1
      responses:
        '200':
          description: 成功
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/User'
 
  /users/{id}:
    get:
      summary: 取得單一使用者
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: 成功
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
        '404':
          description: 找不到使用者
 
components:
  schemas:
    User:
      type: object
      required: [email, name]
      properties:
        id:
          type: integer
          example: 1
        name:
          type: string
          example: "John Doe"
        email:
          type: string
          format: email
        role:
          type: string
          enum: [admin, user, guest]
          default: user

看起來有點長,但它把你以前用 Word 寫的那些「欄位名稱、型別、必填、範例」全部結構化了。而且這份 YAML 就是你的文件——Swagger UI 會自動渲染成可互動的頁面。

Express.js 整合

swagger-jsdoc 讓你直接在 code 旁邊寫文件,而不是另外維護一份 YAML:

npm install swagger-jsdoc swagger-ui-express
// swagger.js
import swaggerJsdoc from 'swagger-jsdoc';
import swaggerUi from 'swagger-ui-express';
 
const specs = swaggerJsdoc({
  definition: {
    openapi: '3.0.0',
    info: { title: 'My API', version: '1.0.0' },
  },
  apis: ['./routes/*.js'], // 讀取 JSDoc 註解
});
 
export function setupSwagger(app) {
  app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(specs));
}
// routes/users.js
/**
 * @swagger
 * /api/users:
 *   get:
 *     summary: 取得使用者列表
 *     tags: [Users]
 *     responses:
 *       200:
 *         description: 成功
 */
router.get('/', async (req, res) => {
  const users = await User.findAll();
  res.json(users);
});

文件跟 code 放在一起,code 改了文件也跟著改。而不是像以前那樣 code 改了半年,文件還停在上古版本。

最佳實踐

先寫 Spec 再實作(API First Design)——先跟前端對好 API 格式,確認 response 結構,再開始寫 code。這樣前後端可以同時開發,不用等來等去。

$ref 重用定義——同一個 User schema 可能出現在十個 endpoint,用 $ref: '#/components/schemas/User' 指過去就好,改一處全部更新。

提供 example——前端看到 type: string 不知道裡面會是什麼,看到 example: "john@example.com" 就清楚了。

完整的錯誤描述——不要只寫 200 的 response。400、401、404、500 都要寫清楚,前端才知道怎麼處理 error。

整合 CI/CD——讓文件自動產生、自動部署。手動維護的文件遲早會跟現實脫節。


好的 API 文件不是「有就好」——是要讓前端看完就能串接,不需要再問你任何問題。


延伸閱讀

OpenAPI 官方規範 Swagger Editor RESTFul API API