Skip to content

Commit da366df

Browse files
frankslinclaude
andcommitted
支持 Wikidata 格式的人物 ID 查詢並改進錯誤處理
為了兼容 Wikidata 的調用格式,修改 person API 以支持前置 0 的 7 位整數格式。 主要變更: 1. ID 驗證規則優化: - 從嚴格的整數驗證改為正則表達式:/^\d{1,7}$/ - 現在支持:0001367、1367、0000001 等格式 - 保持原有的最小值驗證(>= 1) 2. 錯誤處理改進: - HTML 模式:返回帶有錯誤列表的錯誤頁面,不再重定向到首頁 - JSON 模式:返回結構化的 JSON 錯誤響應 - 添加 .alert-danger 樣式用於顯示錯誤信息 3. 前端顯示優化: - 在頁面頂部顯示驗證錯誤信息(紅色警告框) - 錯誤信息清晰列出所有驗證失敗的原因 測試用例: - ✅ /cbdbapi/person?id=0001367 → 正常顯示 - ✅ /cbdbapi/person?id=abc → 顯示錯誤頁面 - ✅ /cbdbapi/person?id=12345678 → 格式錯誤提示 - ✅ /cbdbapi/person?id=abc&o=json → JSON 錯誤響應 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 489adea commit da366df

2 files changed

Lines changed: 38 additions & 6 deletions

File tree

app/Http/Controllers/CbdbApiController.php

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ public function person(Request $request)
1414
$mode = strtolower((string) $request->query('mode', $request->query('o', 'html')));
1515

1616
$validator = Validator::make($request->all(), [
17-
'id' => ['nullable', 'integer', 'min:1'],
17+
'id' => ['nullable', 'regex:/^\d{1,7}$/', function ($attribute, $value, $fail) {
18+
if ((int) $value < 1) {
19+
$fail('The id must be at least 1.');
20+
}
21+
}],
1822
'name' => ['nullable', 'string', 'max:255'],
1923
]);
2024

@@ -24,7 +28,26 @@ public function person(Request $request)
2428
}
2529
});
2630

27-
$validator->validate();
31+
if ($validator->fails()) {
32+
if (!in_array($mode, ['json', 'xml'], true)) {
33+
// HTML mode: return error page
34+
return response()->view('cbdbapi.person', [
35+
'personId' => '',
36+
'searchResults' => [],
37+
'searchTerm' => '',
38+
'validationErrors' => $validator->errors()->all(),
39+
], 400);
40+
} else {
41+
// JSON/XML mode: return JSON error
42+
return response()->json([
43+
'error' => [
44+
'code' => 400,
45+
'message' => 'Validation failed.',
46+
'details' => $validator->errors()->all(),
47+
],
48+
], 400);
49+
}
50+
}
2851

2952
$idParam = $request->query('id');
3053
$nameParam = $request->query('name');

resources/views/cbdbapi/person.blade.php

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@
179179
}
180180
181181
.alert-danger {
182-
background-color: #f5f5f5;
183-
border-color: #999;
184-
color: #333;
182+
background-color: #ffebee;
183+
border-color: #ef5350;
184+
color: #c62828;
185185
}
186186
187187
.api-info-box {
@@ -282,7 +282,16 @@
282282
<h1 class="site-title">中國歷代人物傳記資料庫</h1>
283283
<p class="site-subtitle">China Biographical Database Project (CBDB)</p>
284284

285-
@if(!empty($searchResults))
285+
@if(!empty($validationErrors ?? []))
286+
<div class="alert-box alert-danger">
287+
<strong>錯誤:</strong>
288+
<ul style="margin: 10px 0 0 20px; padding: 0;">
289+
@foreach($validationErrors as $error)
290+
<li>{{ $error }}</li>
291+
@endforeach
292+
</ul>
293+
</div>
294+
@elseif(!empty($searchResults))
286295
<div class="search-results-section">
287296
<div class="search-results-title">
288297
搜尋結果@if($searchTerm):「{{ e($searchTerm) }}@endif

0 commit comments

Comments
 (0)