|
3 | 3 | ## 基本資訊 |
4 | 4 | - 端點:`GET /cbdbapi/person.php` |
5 | 5 | - 預設回應為 HTML;若需 JSON,請於查詢參數加上 `o=json`(或 `mode=json` 亦相容)。 |
6 | | -- 參數:`id` (整數) 或 `name` (字串),至少擇一;若同時提供則以 `id` 為主 |
| 6 | +- 參數: |
| 7 | + - `id`:1-7 位數字(支持前置 0,如 `0001367`,兼容 Wikidata 格式) |
| 8 | + - `name`:字串 |
| 9 | + - 至少需提供 `id` 或 `name` 其中之一;若同時提供則以 `id` 為主 |
7 | 10 | - HTML 模式在 `name` 查詢時會於頁面上方列出最多 20 筆候選人物供點選;JSON 模式則回傳符合條件的第一筆結果。 |
8 | 11 | - 內容格式:JSON |
9 | 12 | - `null` 欄位會輸出為空字串,符合 legacy API 的行為。 |
10 | 13 |
|
11 | 14 | ## 範例請求 |
12 | 15 | ``` |
13 | 16 | GET /cbdbapi/person.php?id=1488&o=json |
| 17 | +GET /cbdbapi/person.php?id=0001488&o=json # Wikidata 格式(前置 0) |
14 | 18 | GET /cbdbapi/person.php?name=張三&o=json |
| 19 | +GET /cbdbapi/person.php?id=1488 # HTML 模式(無 o 參數) |
15 | 20 | ``` |
16 | 21 |
|
17 | 22 | ## 回應結構 |
@@ -50,21 +55,154 @@ GET /cbdbapi/person.php?name=張三&o=json |
50 | 55 | ``` |
51 | 56 |
|
52 | 57 | ## 欄位說明 |
| 58 | + |
| 59 | +### 基本資訊 |
53 | 60 | - `BasicInfo`:包含人物 ID、姓名、指數年份、朝代、出生/卒年、資料來源等欄位。 |
| 61 | + |
| 62 | +### 來源文獻 |
54 | 63 | - `PersonSources.Source`:來源列表,欄位包含 `Source`、`SourceId`、`Pages`、`Notes`。 |
55 | 64 | - `PersonSourcesAs.SourceAs`:保留原版 API 的欄位設計,通常僅用於中央研究院人名權威資料;其內容對應 `PersonSources.Source` 清單中的同一筆來源。 |
| 65 | + |
| 66 | +### 別名與地址 |
56 | 67 | - `PersonAliases.Alias`:別名列表,每筆含 `AliasType`、`AliasTypeId`、`AliasName`。 |
57 | 68 | - `PersonAddresses.Address`:地址資訊,欄位含 `AddrTypeId`、`AddrType`、`AddrId`、`AddrName`、`belongs1_name`/`belongs1_id` 等。 |
58 | | -- `PersonEntryInfo.Entry`:若無資料為空字串。 |
| 69 | + |
| 70 | +### 科舉與任官 |
| 71 | +- `PersonEntryInfo.Entry`:科舉資訊。若無資料為空字串。 |
59 | 72 | - `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` 欄位不會出現在回應中。 |
61 | 127 |
|
62 | 128 | ## 相容性備註 |
63 | 129 | - 資料庫現行欄位為 `POSTED_TO_OFFICE_DATA.c_appt_code`(原版為 `c_appt_type_code`)。原版 API 未同步更新欄位名稱,導致應為「1(正授)」等的除授類別經常回傳預設值「0(未詳)」。本次 API 實作將此問題修正;本文件保留此歷史差異以利追蹤。 |
64 | 130 | - 原版 `/person.php` 透過 `xmlToJson.xsl` 將 XML 轉成 JSON;XSL 會在遍歷 `<Posting>` 節點時重複輸出同一筆資料,使得 `PersonPostings.Posting` 中的 `FirstYear` 等欄位被複製多次。新版控制器直接以 PHP 陣列輸出 JSON,不再出現此重複紀錄。 |
65 | 131 | - 原版 API 期望 null 欄位輸出為空字串,現行 JSON API 亦採此方式,避免前端資料處理需要特殊判斷。 |
66 | 132 | - `name` 查詢會優先以 BIOG_MAIN 的中文、英文與拼音欄位做全字比對,再依序比對 ALTNAME,若仍找不到才改用模糊查詢;命中後回傳第一筆結果。 |
67 | 133 |
|
| 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 | + |
68 | 163 | ## 錯誤回應 |
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