>本教程的第一部分建立了我們API的基礎層:服務器設置,身份驗證,JSON處理,錯誤管理和初始路由。 至關重要的是,我們定義了讀書文件中的資源和行動。現在,讓我們通過實施這些資源來建立這個基礎。
>密鑰概念:
>從聯繫創建開始,REST最佳實踐決定創建或更新後返回資源表示。 雖然為清晰度簡化了此示例中的數據庫交互,但生產API將利用更強大的ORM/模型和驗證庫。 >
本文端點處理請求主體,驗證數據,創建聯繫人記錄,處理相關說明(如果提供),並返回創建聯繫人的JSON表示。 更新操作(
和$app->post( '/contacts', function () use ($app, $log) { $body = $app->request()->getBody(); $errors = $app->validateContact($body); if (empty($errors)) { $contact = \ORM::for_table('contacts')->create(); if (isset($body['notes'])) { $notes = $body['notes']; unset($body['notes']); } $contact->set($body); if ($contact->save()) { if (!empty($notes)) { $contactNotes = []; foreach ($notes as $item) { $item['contact_id'] = $contact->id; $note = \ORM::for_table('notes')->create(); $note->set($item); if ($note->save()) { $contactNotes[] = $note->asArray(); } } } $output = $contact->asArray(); if (!empty($contactNotes)) { $output['notes'] = $contactNotes; } echo json_encode($output, JSON_PRETTY_PRINT); } else { throw new Exception("Unable to save contact"); } } else { throw new ValidationException("Invalid data", 0, $errors); } } );
和/contacts
方法被映射到相同的代碼以提高效率:PUT
PATCH
PUT
聯繫人列表和過濾PATCH
$app->map( '/contacts/:id', function ($id) use ($app, $log) { // Update code here... })->via('PUT', 'PATCH');
但是,穩健的API支持高級查詢:此示例通過
>進行過濾,在>或
中搜索,使用$app->get( '/contacts', function () use ($app, $log) { $contacts = \ORM::forTable('contacts')->findArray(); echo json_encode($contacts, JSON_PRETTY_PRINT); } );
進行排序,然後選擇特定字段。 該實施涉及對輸入進行消毒和動態構建數據庫查詢: 本節將包括用於處理的詳細代碼 >聯繫方式和嵌入式資源 檢索單個聯繫方式很簡單: 等查詢參數來獲取嵌入式資源(例如,註釋)。 如果存在 >緩存和速率限制>
使用中間件實施
>這種增強的API提供了堅實的基礎。 未來的改進包括遷移到更強大的ORM/模型,集成了專用驗證庫,探索替代存儲解決方案,實現API發現(例如Swagger)以及創建全面的測試套件。 完整的源代碼(如原件中所述)將提供完整的實施詳細信息。 以上是從頭開始構建REST API:實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!$app->post(
'/contacts',
function () use ($app, $log) {
$body = $app->request()->getBody();
$errors = $app->validateContact($body);
if (empty($errors)) {
$contact = \ORM::for_table('contacts')->create();
if (isset($body['notes'])) {
$notes = $body['notes'];
unset($body['notes']);
}
$contact->set($body);
if ($contact->save()) {
if (!empty($notes)) {
$contactNotes = [];
foreach ($notes as $item) {
$item['contact_id'] = $contact->id;
$note = \ORM::for_table('notes')->create();
$note->set($item);
if ($note->save()) {
$contactNotes[] = $note->asArray();
}
}
}
$output = $contact->asArray();
if (!empty($contactNotes)) {
$output['notes'] = $contactNotes;
}
echo json_encode($output, JSON_PRETTY_PRINT);
} else {
throw new Exception("Unable to save contact");
}
} else {
throw new ValidationException("Invalid data", 0, $errors);
}
}
);
fields
>,sort
,page
,per_page
參數,構建查詢和管理分頁,包括生成Link
> $app->map(
'/contacts/:id',
function ($id) use ($app, $log) {
// Update code here...
})->via('PUT', 'PATCH');
/api/v1/contacts/1?embed=notes
>參數,則將修改該代碼以包含註釋的附加查詢。 embed
>