Skip to content

Commit 64dc5e2

Browse files
committed
展開 API 文檔的欄位說明
詳細說明 PersonSocialStatus、PersonKinshipInfo、PersonSocialAssociation 和 PersonTexts 四個欄位的結構與內容,包含: - 每個欄位的資料來源表格 - 各子欄位的詳細說明 - 空資料的處理方式 同時更新基本資訊、範例請求與其他欄位的組織結構,提升文檔可讀性。
1 parent 301f35f commit 64dc5e2

1 file changed

Lines changed: 143 additions & 5 deletions

File tree

CBDB_PUBLIC_API_V1.md

Lines changed: 143 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,20 @@
33
## 基本資訊
44
- 端點:`GET /cbdbapi/person.php`
55
- 預設回應為 HTML;若需 JSON,請於查詢參數加上 `o=json`(或 `mode=json` 亦相容)。
6-
- 參數:`id` (整數) 或 `name` (字串),至少擇一;若同時提供則以 `id` 為主
6+
- 參數:
7+
- `id`:1-7 位數字(支持前置 0,如 `0001367`,兼容 Wikidata 格式)
8+
- `name`:字串
9+
- 至少需提供 `id``name` 其中之一;若同時提供則以 `id` 為主
710
- HTML 模式在 `name` 查詢時會於頁面上方列出最多 20 筆候選人物供點選;JSON 模式則回傳符合條件的第一筆結果。
811
- 內容格式:JSON
912
- `null` 欄位會輸出為空字串,符合 legacy API 的行為。
1013

1114
## 範例請求
1215
```
1316
GET /cbdbapi/person.php?id=1488&o=json
17+
GET /cbdbapi/person.php?id=0001488&o=json # Wikidata 格式(前置 0)
1418
GET /cbdbapi/person.php?name=張三&o=json
19+
GET /cbdbapi/person.php?id=1488 # HTML 模式(無 o 參數)
1520
```
1621

1722
## 回應結構
@@ -50,21 +55,154 @@ GET /cbdbapi/person.php?name=張三&o=json
5055
```
5156

5257
## 欄位說明
58+
59+
### 基本資訊
5360
- `BasicInfo`:包含人物 ID、姓名、指數年份、朝代、出生/卒年、資料來源等欄位。
61+
62+
### 來源文獻
5463
- `PersonSources.Source`:來源列表,欄位包含 `Source``SourceId``Pages``Notes`
5564
- `PersonSourcesAs.SourceAs`:保留原版 API 的欄位設計,通常僅用於中央研究院人名權威資料;其內容對應 `PersonSources.Source` 清單中的同一筆來源。
65+
66+
### 別名與地址
5667
- `PersonAliases.Alias`:別名列表,每筆含 `AliasType``AliasTypeId``AliasName`
5768
- `PersonAddresses.Address`:地址資訊,欄位含 `AddrTypeId``AddrType``AddrId``AddrName``belongs1_name`/`belongs1_id` 等。
58-
- `PersonEntryInfo.Entry`:若無資料為空字串。
69+
70+
### 科舉與任官
71+
- `PersonEntryInfo.Entry`:科舉資訊。若無資料為空字串。
5972
- `PersonPostings.Posting`:任官資訊,含職官、地址、起訖年份、出處等。欄位 `FirstYearNiaohaoYear`(第一个 `o` 應為 `n`)保留了舊版 API 的拼字錯誤以維持相容性。
60-
- `PersonSocialStatus``PersonKinshipInfo``PersonSocialAssociation``PersonTexts`:若無資料則輸出空字串。
73+
74+
### 社會身份
75+
- `PersonSocialStatus.SocialStatus`:社會身份資訊清單(來源:STATUS_DATA 表)。每筆包含:
76+
- `StatusId`:身份代碼
77+
- `StatusName`:身份名稱(中文)
78+
- `FirstYear`:起始年份
79+
- `LastYear`:終止年份
80+
81+
若無資料則整個 `PersonSocialStatus` 欄位不會出現在回應中。
82+
83+
### 親屬關係
84+
- `PersonKinshipInfo.Kinship`:親屬關係資訊清單(來源:KIN_DATA 表)。每筆包含:
85+
- `KinPersonId`:親屬人物 ID
86+
- `KinPersonName`:親屬人物姓名(中文)
87+
- `KinCode`:親屬關係代碼
88+
- `KinRel`:親屬關係(英文)
89+
- `KinRelName`:親屬關係名稱(中文)
90+
- `Source`:來源文獻標題
91+
- `Pages`:頁碼
92+
- `Notes`:註記
93+
94+
若無資料則整個 `PersonKinshipInfo` 欄位不會出現在回應中。
95+
96+
### 社會關係
97+
- `PersonSocialAssociation.Association`:社會關係資訊清單(來源:ASSOC_DATA 表)。每筆包含:
98+
- `AssocPersonId`:社會關係人物 ID
99+
- `AssocPersonName`:社會關係人物姓名(中文)
100+
- `AssocCode`:社會關係代碼
101+
- `AssocName`:社會關係名稱(中文)
102+
- `Year`:年份
103+
- `TextTitle`:文獻標題
104+
- `KinPersonId`:親屬人物 ID(若社會關係涉及親屬)
105+
- `KinPersonName`:親屬人物姓名
106+
- `KinRelName`:親屬關係名稱
107+
- `AssocKinPersonId`:關係人物的親屬 ID
108+
- `AssocKinPersonName`:關係人物的親屬姓名
109+
- `AssocKinRelName`:關係人物的親屬關係名稱
110+
- `Source`:來源文獻標題
111+
- `Pages`:頁碼
112+
- `Notes`:註記
113+
114+
若無資料則整個 `PersonSocialAssociation` 欄位不會出現在回應中。
115+
116+
### 著作文獻
117+
- `PersonTexts.Text`:人物相關文獻清單(來源:TEXT_CODES + BIOG_TEXT_DATA 表)。每筆包含:
118+
- `TextId`:文獻 ID
119+
- `TextName`:文獻標題(中文)
120+
- `Year`:年份
121+
- `Role`:該人物在文獻中的角色(如「作者」、「撰者」等)
122+
- `Source`:來源文獻標題
123+
- `Pages`:頁碼
124+
- `Notes`:註記
125+
126+
若無資料則整個 `PersonTexts` 欄位不會出現在回應中。
61127

62128
## 相容性備註
63129
- 資料庫現行欄位為 `POSTED_TO_OFFICE_DATA.c_appt_code`(原版為 `c_appt_type_code`)。原版 API 未同步更新欄位名稱,導致應為「1(正授)」等的除授類別經常回傳預設值「0(未詳)」。本次 API 實作將此問題修正;本文件保留此歷史差異以利追蹤。
64130
- 原版 `/person.php` 透過 `xmlToJson.xsl` 將 XML 轉成 JSON;XSL 會在遍歷 `<Posting>` 節點時重複輸出同一筆資料,使得 `PersonPostings.Posting` 中的 `FirstYear` 等欄位被複製多次。新版控制器直接以 PHP 陣列輸出 JSON,不再出現此重複紀錄。
65131
- 原版 API 期望 null 欄位輸出為空字串,現行 JSON API 亦採此方式,避免前端資料處理需要特殊判斷。
66132
- `name` 查詢會優先以 BIOG_MAIN 的中文、英文與拼音欄位做全字比對,再依序比對 ALTNAME,若仍找不到才改用模糊查詢;命中後回傳第一筆結果。
67133

134+
## 版本更新記錄
135+
136+
### 2025-11-08:Wikidata 格式支持
137+
- **ID 格式擴展**:支持 1-7 位數字,包含前置 0(如 `0001367`
138+
- **驗證改進**:從嚴格整數驗證改為正則表達式 `/^\d{1,7}$/`
139+
- **錯誤處理優化**
140+
- HTML 模式:顯示錯誤頁面而非重定向
141+
- JSON 模式:結構化錯誤響應
142+
- 統一使用 422 狀態碼表示驗證錯誤
143+
- **兼容性**:完全向後兼容,原有的整數 ID 格式照常運作
144+
145+
### 測試用例
146+
```bash
147+
# ✅ 標準格式
148+
curl "https://cbdb.example.com/cbdbapi/person.php?id=1367&o=json"
149+
150+
# ✅ Wikidata 格式(前置 0)
151+
curl "https://cbdb.example.com/cbdbapi/person.php?id=0001367&o=json"
152+
153+
# ✅ 最大長度(7 位)
154+
curl "https://cbdb.example.com/cbdbapi/person.php?id=1234567&o=json"
155+
156+
# ❌ 超過 7 位(返回 422)
157+
curl "https://cbdb.example.com/cbdbapi/person.php?id=12345678&o=json"
158+
159+
# ❌ 非數字格式(返回 422)
160+
curl "https://cbdb.example.com/cbdbapi/person.php?id=abc123&o=json"
161+
```
162+
68163
## 錯誤回應
69-
- `422 Unprocessable Entity`:缺少 `id``id` 非正整數。
70-
- `404 Not Found`:找不到對應人物。
164+
165+
### 驗證錯誤 (422 Unprocessable Entity)
166+
167+
**觸發條件**
168+
- 未提供 `id``name` 參數
169+
- `id` 格式不符(非 1-7 位數字)
170+
- `id` 包含非數字字符
171+
- `id` 超過 7 位數
172+
173+
**JSON 模式回應範例**
174+
```json
175+
{
176+
"error": {
177+
"code": 422,
178+
"message": "Validation failed.",
179+
"details": [
180+
"The id format is invalid."
181+
]
182+
}
183+
}
184+
```
185+
186+
**HTML 模式回應**
187+
- 返回帶有錯誤信息的頁面(紅色警告框)
188+
- 列出所有驗證失敗的原因
189+
- 不再重定向到首頁
190+
191+
### 資源不存在 (404 Not Found)
192+
193+
**觸發條件**
194+
- 找不到對應的人物記錄
195+
196+
**JSON 模式回應範例**
197+
```json
198+
{
199+
"error": {
200+
"code": 404,
201+
"message": "Person not found."
202+
}
203+
}
204+
```
205+
206+
**HTML 模式回應**
207+
- 對於 `id` 查詢:顯示「找不到該人物」的提示頁面
208+
- 對於 `name` 查詢:顯示「找不到符合條件的人物」提示

0 commit comments

Comments
 (0)