首頁 > 後端開發 > php教程 > 從頭開始構建REST API:實現

從頭開始構建REST API:實現

William Shakespeare
發布: 2025-02-20 10:13:10
原創
670 人瀏覽過

Build a REST API from Scratch: Implementation

>本教程的第一部分建立了我們API的基礎層:服務器設置,身份驗證,JSON處理,錯誤管理和初始路由。 至關重要的是,我們定義了讀書文件中的資源和行動。現在,讓我們通過實施這些資源來建立這個基礎。

>

密鑰概念:

  • >及時的最佳實踐:創建和更新操作返回資源表示。 強大的ORM/模型和驗證庫對於生產應用程序至關重要。
  • >
  • 錯誤處理和驗證:嚴格的錯誤處理和驗證確保數據完整性和適當的響應。 這包括強制性字段(例如名字)和唯一的電子郵件檢查。
  • 高級查詢:>實現過濾,分類和分頁,以進行有效的數據檢索和改進的客戶端性能。 >
  • >緩存:>使用中間件的ETAG和服務器端緩存(例如APC),以進行優化的響應時間和減少的服務器加載。
  • 速率限制:
  • 基於中間件的限制限制API過度使用,確保可用性和可靠性。 通過考慮高級ORM/模型解決方案,外部驗證庫以及APC以外的替代存儲選項, 未來的增強:
  • 可擴展性的計劃。
  • > 聯繫人管理:創建和更新
>

>從聯繫創建開始,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);
}
);
登入後複製
>,按

進行排序,然後選擇特定字段。 該實施涉及對輸入進行消毒和動態構建數據庫查詢:>

$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>,sortpageper_page參數,構建查詢和管理分頁,包括生成Link>

>聯繫方式和嵌入式資源

>

檢索單個聯繫方式很簡單:

$app->map(
'/contacts/:id',
function ($id) use ($app, $log) {
    // Update code here...
})->via('PUT', 'PATCH');
登入後複製
登入後複製
為了提高效率,可以使用

等查詢參數來獲取嵌入式資源(例如,註釋)。 如果存在/api/v1/contacts/1?embed=notes>參數,則將修改該代碼以包含註釋的附加查詢。 embed>

>緩存和速率限制> 使用中間件實施

>緩存和速率限制,增強性能和API保護。 中間件代碼(用於緩存和限制速率)將類似於原始示例,處理緩存命中/錯過,ETAG生成,到期和費率限制檢查,包括適當的HTTP標頭。

進一步的開發

>這種增強的API提供了堅實的基礎。 未來的改進包括遷移到更強大的ORM/模型,集成了專用驗證庫,探索替代存儲解決方案,實現API發現(例如Swagger)以及創建全面的測試套件。 完整的源代碼(如原件中所述)將提供完整的實施詳細信息。

>

以上是從頭開始構建REST API:實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板