원클릭으로
api-development
API 開發流程引導技能,協助開發者選擇合適的開發流程(API First 或 Code First),並提供 OpenAPI 規格管理、程式碼產生等自動化支援。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
API 開發流程引導技能,協助開發者選擇合適的開發流程(API First 或 Code First),並提供 OpenAPI 規格管理、程式碼產生等自動化支援。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
BDD 測試實作技能,協助開發者使用 Reqnroll 撰寫行為驅動開發測試,包含 Gherkin 語法、測試步驟實作與 Docker 測試環境設定。
快取策略與多層快取設計技能,協助開發者實作 L1 Memory + L2 Redis 分層快取,包含 TTL 管理、版本控制與失效策略。
EF Core 操作與最佳化技能,協助開發者正確使用 Entity Framework Core,包含 DbContextFactory 模式、查詢最佳化、Migration 管理與反向工程。
專案初始化與配置技能,負責引導使用者完成新專案的初始化、配置設定、GitHub 範本套用與專案狀態檢測。
Repository 設計指導技能,協助開發者根據業務需求選擇最合適的 Repository 設計策略(資料表導向 vs 需求導向 vs 混合模式)。
GitHub Copilot Skill 與 Agent 設計指導技能,協助開發者設計與實作高品質的 Skill 和 Agent,包含架構設計、最佳實踐、工作流程規劃與常見反模式識別。
| name | api-development |
| description | API 開發流程引導技能,協助開發者選擇合適的開發流程(API First 或 Code First),並提供 OpenAPI 規格管理、程式碼產生等自動化支援。 |
本 SKILL 須搭配閱讀:
API 開發流程引導技能,協助開發者選擇合適的開發流程(API First 或 Code First),並提供 OpenAPI 規格管理、程式碼產生等自動化支援。
dotnet-project-template/doc/openapi.yml 編輯
node .claude/skills/shared/FileResolver.js get-content dotnet-project-template/doc/openapi.yml協助開發者根據專案需求選擇合適的 API 開發流程:
task codegen-api-servertask codegen-api-client@workspace 我想要開發新的 API 端點
使用 api-development 開發 API
graph TD
A[啟動 Skill] --> B{詢問 API 開發流程}
B -->|API First| C[檢查 OpenAPI 規格狀態]
B -->|Code First| D[跳過規格,直接實作]
C -->|已定義| E[提醒已存在定義]
C -->|需更新| F[協助更新 OpenAPI 規格]
C -->|尚未定義| G[協助建立 OpenAPI 規格]
F --> H[執行 codegen-api-server]
G --> H
H --> I[產生 Controller 骨架]
I --> J[提供 Controller 實作範本]
J --> K[詢問是否產生 Client SDK]
K -->|是| L[執行 codegen-api-client]
K -->|否| M[完成]
L --> M
D --> N[提供 Code First 指導]
N --> O[提醒後續需手動維護 OpenAPI]
O --> M
請選擇 API 開發流程:
1️⃣ API First(推薦)
✅ API 文件與實作 100% 同步
✅ 前後端可並行開發
✅ 自動產生 Client SDK
✅ 編譯時契約檢查
⚠️ 需先設計 API 規格
適用場景:
- 前後端分離且團隊並行開發
- 需要提供 Client SDK 給第三方
- API 穩定性要求高
- 多個客戶端(Web、Mobile、Desktop)
2️⃣ Code First
✅ 快速啟動開發
✅ 直接實作程式碼
⚠️ 需手動維護 API 文件
⚠️ 文件與實作可能不同步
適用場景:
- 快速原型驗證
- 內部小型專案
- API 結構仍在快速變動中
- 單人開發或小團隊
請確認 OpenAPI 規格狀態:
1️⃣ 已定義
- doc/openapi.yml 已包含此 API 的端點定義
- 我只需要產生程式碼
2️⃣ 需要更新
- doc/openapi.yml 存在但需要加入新的端點
- 我需要協助修改規格
3️⃣ 尚未定義
- doc/openapi.yml 不存在或沒有此端點
- 我需要從頭建立規格
請確認此專案的 API 開發方式:
1️⃣ API First(推薦用於團隊協作、Client SDK 需求)
- 預先定義 OpenAPI 規格(openapi.yaml)
- 自動產生 Controller 骨架
- 命名約定:XxxControllerImpl
- 適用:公開 API、大型團隊、Client SDK 分發
2️⃣ Code First(推薦用於快速原型、內部小型專案)
- 直接編寫 Controller 類別,無預先規格
- 使用 Route 和 HttpMethod 特性定義端點
- 命名約定:XxxController(無 Impl 後綴)
- 適用:快速原型、內部 API、小型團隊
⚠️ 重要:同一專案內只能選擇一種方式,不得混用
請選擇需要實作的分層(可多選):
☑️ Controller
- HTTP 請求處理與路由
- 請求驗證
- HTTP 狀態碼對應
☑️ Handler
- 業務邏輯處理
- 流程協調
- 錯誤處理與結果封裝
☑️ Repository
- 資料存取邏輯
- EF Core 操作
- 資料庫查詢封裝
提示:通常需要三層都實作以完成完整功能
是否需要產生 Client SDK?
1️⃣ 是,產生 Client SDK
- 自動產生強型別 API 客戶端
- 前端可直接使用
- 完整的 IntelliSense 支援
- 產生位置:JobBank1111.Job.Contract/AutoGenerated/
2️⃣ 否,暫不產生
- 僅產生 Server Controller
- 後續可隨時執行 task codegen-api-client
paths:
/api/v1/members:
post:
summary: 建立新會員
operationId: CreateMember
tags:
- Member
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateMemberRequest'
responses:
'201':
description: 會員建立成功
content:
application/json:
schema:
$ref: '#/components/schemas/MemberResponse'
'400':
description: 請求驗證失敗
content:
application/json:
schema:
$ref: '#/components/schemas/Failure'
'409':
description: Email 已被使用
content:
application/json:
schema:
$ref: '#/components/schemas/Failure'
'500':
description: 內部伺服器錯誤
content:
application/json:
schema:
$ref: '#/components/schemas/Failure'
components:
schemas:
CreateMemberRequest:
type: object
required:
- email
- name
properties:
email:
type: string
format: email
example: "user@example.com"
name:
type: string
minLength: 1
maxLength: 100
example: "張三"
phone:
type: string
pattern: '^\d{10}$'
example: "0912345678"
MemberResponse:
type: object
properties:
id:
type: string
format: uuid
email:
type: string
name:
type: string
createdAt:
type: string
format: date-time
# 執行 Taskfile 命令
task codegen-api-server
# 產生位置
# JobBank1111.Job.WebAPI/Contract/AutoGenerated/
# 執行 Taskfile 命令
task codegen-api-client
# 產生位置
# JobBank1111.Job.Contract/AutoGenerated/
產生的 Controller 骨架需要實作自動產生的介面,整合以下元件:
命名約定:使用 XxxControllerImpl 命名(Impl 後綴表示 API First 實作)
完整實作範本請參考生產代碼(透過 FileResolver):
node .claude/skills/shared/FileResolver.js get-content \
JobBank1111.Job.WebAPI/Member/MemberV1ControllerImpl.cs
無需實作自動產生的介面,直接建立 Controller 類別實作業務邏輯:
命名約定:使用 XxxController 命名(無 Impl 後綴表示 Code First 實作)
重要提醒:Code First 開發完成後,需手動維護 OpenAPI 規格文件以保持文件同步。
| 比較項目 | API First(推薦) | Code First |
|---|---|---|
| 文件同步 | ✅ 自動 100% 同步 | ❌ 需手動維護 |
| 前後端協作 | ✅ 可並行開發 | ⚠️ 需等後端完成 |
| 契約保證 | ✅ 編譯時檢查 | ❌ 執行時才發現 |
| Client SDK | ✅ 自動產生 | ❌ 需手動實作 |
| 開發速度 | ⚠️ 需先設計 API | ✅ 快速啟動 |
| 維護成本 | ✅ 低(自動同步) | ❌ 高(手動維護) |
| 團隊協作 | ✅ 優秀 | ⚠️ 一般 |
| 適用場景 | 中大型專案、團隊協作 | 小型專案、快速原型 |
編輯 doc/openapi.yml,新增 API 端點定義。
OpenAPI 規格會自動透過 FileResolver 取得(本地優先,找不到時從 GitHub 下載並快取)。開發者可在本地
dotnet-project-template/doc/openapi.yml直接編輯。
task codegen-api-server
產生檔案:
JobBank1111.Job.WebAPI/Contract/AutoGenerated/IMemberApi.cs(介面)建立 MemberController.cs 實作自動產生的介面:
[ApiController]
[Route("api/v1/members")]
public class MemberController(MemberHandler handler) : ControllerBase, IMemberApi
{
public async Task<IActionResult> CreateMember(
CreateMemberRequest request,
CancellationToken cancellationToken = default)
{
var result = await handler.CreateMemberAsync(request, cancellationToken);
return result.Match(
success => StatusCode(201, success),
failure => StatusCode(
FailureCodeMapper.ToHttpStatusCode(failure.Code),
failure)
);
}
}
Code First 開發方式適用於快速原型、內部小型專案或需要高度定制的場景。與 API First 不同,Code First 無需預先定義 OpenAPI 規格,而是直接撰寫 Controller 類別。
無需預先產生 OpenAPI 規格,直接建立 MemberController.cs(無 Impl 後綴):
[ApiController]
[Route("api/v2/members")]
public class MemberController(MemberHandler handler) : ControllerBase
{
[HttpPost]
[ProducesResponseType(typeof(MemberDto), StatusCodes.Status201Created)]
[ProducesResponseType(typeof(FailureResponse), StatusCodes.Status400BadRequest)]
public async Task<IActionResult> CreateMember(
[FromBody] CreateMemberRequest request,
CancellationToken cancellationToken = default)
{
var result = await handler.CreateMemberAsync(request, cancellationToken);
return result.Match(
success => StatusCode(201, success),
failure => StatusCode(
FailureCodeMapper.ToHttpStatusCode(failure.Code),
failure)
);
}
[HttpGet("{id}")]
[ProducesResponseType(typeof(MemberDto), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(FailureResponse), StatusCodes.Status404NotFound)]
public async Task<IActionResult> GetMember(
[FromRoute] int id,
CancellationToken cancellationToken = default)
{
var result = await handler.GetMemberAsync(id, cancellationToken);
return result.Match(
success => Ok(success),
failure => StatusCode(
FailureCodeMapper.ToHttpStatusCode(failure.Code),
failure)
);
}
[HttpPut("{id}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(typeof(FailureResponse), StatusCodes.Status404NotFound)]
public async Task<IActionResult> UpdateMember(
[FromRoute] int id,
[FromBody] UpdateMemberRequest request,
CancellationToken cancellationToken = default)
{
var result = await handler.UpdateMemberAsync(id, request, cancellationToken);
return result.Match(
success => NoContent(),
failure => StatusCode(
FailureCodeMapper.ToHttpStatusCode(failure.Code),
failure)
);
}
[HttpDelete("{id}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(typeof(FailureResponse), StatusCodes.Status404NotFound)]
public async Task<IActionResult> DeleteMember(
[FromRoute] int id,
CancellationToken cancellationToken = default)
{
var result = await handler.DeleteMemberAsync(id, cancellationToken);
return result.Match(
success => NoContent(),
failure => StatusCode(
FailureCodeMapper.ToHttpStatusCode(failure.Code),
failure)
);
}
}
關鍵特徵:
與 API First 完全相同,實作 MemberHandler 和相關的 DTO、實體。
使用工具產生初始 OpenAPI 規格,或手動編寫規格文件以保持一致性:
docs/openapi.yaml 手動編寫規格,並定期與代碼同步Code First 開發完成後,可選擇自動產生 Client SDK 或手動實作 HTTP 客戶端。
| 階段 | API First | Code First |
|---|---|---|
| 規格設計 | 1-2 小時 | 0 小時(無預先規格) |
| Code 產生 | 10 分鐘 | 0 小時(無自動產生) |
| 實作階段 | 2-3 小時 | 2-3 小時 |
| 文件同步 | 0 小時 | 1-2 小時(手動維護) |
Code First 推薦:
API First 推薦:
生產代碼範例(透過 FileResolver):
node .claude/skills/shared/FileResolver.js get-content \
JobBank1111.Job.WebAPI/Member/MemberController.cs
task codegen-api-client
產生檔案:
JobBank1111.Job.Contract/AutoGenerated/IMemberApi.cs(Client 介面)JobBank1111.Job.Contract/AutoGenerated/MemberApiClient.cs(Client 實作)💡 獨立用戶提示:所有檔案參考自動使用 FileResolver 工具。 即使您沒有下載完整專案,SKILL 也會自動從 GitHub 取得所需的範本與文檔。 無需手動下載
dotnet-project-template。
💡 所有範本已改為使用 FileResolver 動態取得真實項目代碼,確保始終同步更新。
取得真實實作範例:
# Controller 實作
node .claude/skills/shared/FileResolver.js get-content \
JobBank1111.Job.WebAPI/Member/MemberV1ControllerImpl.cs
# Handler 實作
node .claude/skills/shared/FileResolver.js get-content \
JobBank1111.Job.WebAPI/Member/MemberHandler.cs
XxxControllerImpl 命名(Impl 後綴表示由規格自動產生的實作)XxxController 命名(無 Impl 後綴表示直接實作)❌ 錯誤:無法產生程式碼
執行命令:task codegen-api-server
錯誤訊息:OpenAPI 規格格式錯誤
建議:
1. 檢查 doc/openapi.yml 格式是否正確
2. 使用線上驗證工具:https://editor.swagger.io/
3. 確認 YAML 縮排正確(使用空格,不使用 Tab)
❌ 錯誤:Controller 編譯失敗
錯誤訊息:CS0535: 'MemberController' does not implement interface member 'IMemberApi.CreateMember'
建議:
1. 確認方法簽章與介面定義完全一致
2. 檢查參數名稱、類型、回傳類型
3. 參考專案內的實際 Controller 實作
API 開發方式相關:
/api-development - API First vs Code First 決策與流程選擇與開發方式無關的實作 Skills(API First 和 Code First 均適用):
/handler - Handler 業務邏輯實作(兩種方式通用)/error-handling - Result Pattern 錯誤處理(兩種方式通用)/bdd-testing - API 端點 BDD 測試(兩種方式通用)/repository-design - 資料存取層設計(兩種方式通用)/ef-core - EF Core 最佳化(兩種方式通用)/caching-strategy - 快取設計(兩種方式通用)相關文檔:
feature-development-agent - 完整功能開發流程(整合此 skill 的決策節點)architecture-review-agent - 架構檢視(驗證 API 層設計是否遵循原則)