亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
SSL 無處不在
JSON 中間件
REST API 的關鍵組件是什麼?
如何保護我的 REST API?
如何對我的 REST API 進行版本控制?
如何在 REST API 中處理錯誤?
如何測試我的 REST API?
如何記錄我的 REST API?
如何設計 RESTful API?
如何在我的 REST API 中分頁結果?
如何限制我的 REST API 的速率?
如何部署我的 REST API?
首頁 後端開發(fā) php教程 從頭開始構建REST API:簡介

從頭開始構建REST API:簡介

Feb 20, 2025 am 11:48 AM

Build a REST API from Scratch: An Introduction

當前的互聯(lián)網(wǎng)生態(tài)系統(tǒng)已被 API 徹底改變,這是有充分理由的。通過在產品或服務中使用第三方 API,您可以訪問大量有用的功能——例如身份驗證或存儲服務——這些功能對您和您的用戶都有利。通過公開您自己的 API,您的應用程序將成為“組合的一部分”,並以您從未想過的方式使用……當然,如果您以正確的方式這樣做。在這個由兩部分組成的系列文章中,我將向您展示如何使用一系列真實的最佳實踐為您的 PHP 應用程序創(chuàng)建 RESTful API 層。本項目完整的源代碼將在第 2 部分的結尾提供。

關鍵要點

  • REST API 對現(xiàn)代 Web 服務至關重要,它為開發(fā)人員提供了一個用戶友好的界面來訪問和操作應用程序數(shù)據(jù)。
  • 文檔至關重要;它應該從總結 API 範圍並詳細說明訪問點和方法的 README 文件開始。
  • Slim Framework 與 Idiorm 和 Monolog 等工具結合使用,可以利用強大的路由和中間件集成功能來促進高效的 API 開發(fā)。
  • 實施 HTTPS 可確保安全通信,防止未經(jīng)授權訪問客戶端和服務器之間傳輸?shù)臄?shù)據(jù)。
  • 以 JSON 格式實現(xiàn)結構化錯誤處理可增強 API 的可用性,提供清晰的錯誤消息和代碼,有助於調試和集成。
  • 通過令牌優(yōu)先於基本身份驗證以及 JSON 處理等中間件進行身份驗證對於有效地保護和管理 API 交互至關重要。

REST:開發(fā)人員友好的 UI

首先,API 是開發(fā)人員的用戶界面,因此它必須友好、簡單、易於使用,當然也要令人愉快;否則,它最終將成為另一個數(shù)字垃圾。即使只是一個簡單但寫得很好的 README 文件,文檔也是一個良好的開端。我們需要最少的信息是服務範圍的摘要以及方法和訪問點的列表。一個好的摘要可以是:> 我們的應用程序是一個簡單的聯(lián)繫人列表服務,用於管理具有關聯(lián)筆記的聯(lián)繫人。它有兩種對像類型,聯(lián)繫人(contacts)和筆記(notes)。每個聯(lián)繫人都有基本屬性,例如名字、姓氏和電子郵件地址。此外,每個聯(lián)繫人可以有多個與之關聯(lián)的 Markdown 格式的筆記。

然後,最好列出我們將要實現(xiàn)的所有資源和操作。這可以被視為可視化應用程序線框圖的等效項。遵循 REST 的關鍵原則,每個資源都由一個 URL 表示,其中操作是用於訪問它的 HTTP 方法。例如,GET /api/contacts/12 將檢索 ID 為 12 的聯(lián)繫人,而 PUT /api/contacts/12 將更新相同的聯(lián)繫人。完整的 method 列表如下所示:

<code>URL             HTTP Method  Operation
/api/contacts   GET          返回聯(lián)系人數(shù)組
/api/contacts/:id GET          返回 ID 為 :id 的聯(lián)系人
/api/contacts   POST         添加一個新聯(lián)系人并返回它(添加了 id 屬性)
/api/contacts/:id PUT          更新 ID 為 :id 的聯(lián)系人
/api/contacts/:id PATCH        部分更新 ID 為 :id 的聯(lián)系人
/api/contacts/:id DELETE       刪除 ID 為 :id 的聯(lián)系人

/api/contacts/:id/star PUT    將 ID 為 :id 的聯(lián)系人添加到收藏夾
/api/contacts/:id/star DELETE 從收藏夾中刪除 ID 為 :id 的聯(lián)系人

/api/contacts/:id/notes GET   返回 ID 為 :id 的聯(lián)系人的筆記
/api/contacts/:id/notes/:nid GET   返回 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記
/api/contacts/:id/notes POST  為 ID 為 :id 的聯(lián)系人添加新筆記
/api/contacts/:id/notes/:nid PUT   更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記
/api/contacts/:id/notes/:nid PATCH  部分更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記
/api/contacts/:id/notes/:nid DELETE 刪除 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記</code>

對於更完整和專業(yè)的文檔,您可以考慮使用 Swagger、apiDoc 或 Google APIs Discovery Service 等工具:您的用戶會喜歡您的!

工具和設置

我將用來構建 API 的主要工具是 Slim Framework。為什麼? > [它] 幫助您快速編寫簡單而強大的 Web 應用程序和 API。

這是真的。其強大的路由功能使使用GET 和POST 以外的方法變得容易,它提供對HTTP 方法覆蓋的內置支持(通過HTTP 標頭和隱藏的POST 字段),並且可以與中間件和額外功能掛鉤,使應用程序和API 開發(fā)真正變得容易。與 Slim 一起,我使用 Idiorm 訪問數(shù)據(jù)庫層,使用 Monolog 進行日誌記錄。因此,我們的 composer.json 文件將如下所示:

{
  "name": "yourname/my-contacts",
  "description": "Simple RESTful API for contacts management",
  "license": "MIT",
  "authors": [
    {
      "name": "Your Name",
      "email": "you@yourdomain.com"
    }
  ],
  "require": {
    "slim/slim": "*",
    "slim/extras": "*",
    "slim/middleware": "*",
    "monolog/monolog": "*",
    "j4mie/paris": "*",
    "flynsarmy/slim-monolog": "*"
  },
  "archive": {
    "exclude": ["vendor", ".DS_Store", "*.log"]
  },
  "autoload": {
    "psr-0": {
      "API": "lib/"
    }
  }
}

slim/extras 和 slim/middleware 包提供了諸如內容類型解析和基本身份驗證之類的有用功能。我們的自定義類位於 API 命名空間下,位於 lib 目錄中。此時,我們的工作目錄結構如下所示:

<code>bootstrap.php
composer.json
README.md
bin/
    import
    install
lib/
    API/
public/
    .htaccess
    index.php
share/
    config/
        default.php
    db/
    logs/
    sql/
        data/
            contacts.sql
            users.sql
        tables/
            contacts.sql
            notes.sql
            users.sql
        ssl/
            mysitename.crt
            mysitename.key</code>

我們的應用程序的前端控制器是 public/index.php,所有非文件或目錄流量都通過標準 URL 重寫規(guī)則重定向到此處。然後,我將所有初始化代碼放在 bootstrap.php 中,我們稍後會看到。 share 目錄包含數(shù)據(jù),例如日誌、配置文件、SQLite 數(shù)據(jù)庫和轉儲文件以及 SSL 證書。 bin 目錄包含使用提供的 .sql 文件創(chuàng)建數(shù)據(jù)庫和導入一些數(shù)據(jù)的實用程序腳本。

SSL 無處不在

我們的 API 只能在 HTTPS 模式下訪問,無需重定向。這簡化了身份驗證邏輯並防止配置不當?shù)目蛻舳嗽L問未加密的端點。設置此方法最簡單和最合乎邏輯的方法是直接作用於 Web 服務器或通過代理服務器。我使用舊的可靠的 Apache 來執(zhí)行此操作,我的虛擬主機文件如下所示:

<Directory>

  # Required for mod_rewrite in .htaccess
  AllowOverride FileInfo

  Options All -Indexes

  DirectoryIndex index.php index.shtml index.html

  <IfModule php5_module="">
    # For Development only!
    php_flag display_errors On
  </IfModule>

  # Enable gzip compression
  <IfModule filter_module="">
    AddOutputFilterByType DEFLATE application/json
  </IfModule>

  Order deny,allow
  Deny from all
  Allow from 127.0.0.1
</Directory>

<VirtualHost *:80>
  ServerAdmin you@yourdomain.com
  DocumentRoot "/path/to/MyApp/public"
  ServerName myapp.dev

  <IfModule rewrite_module="">
    RewriteEngine on

    ## Throw a 403 (forbidden) status for non secure requests
    RewriteCond %{HTTPS} off
    RewriteRule ^.*$ - [L,R=403]
  </IfModule>
</VirtualHost>

<IfModule ssl_module="">

  NameVirtualHost *:443

  Listen 443
  SSLRandomSeed startup builtin
  SSLRandomSeed connect builtin

  <VirtualHost *:443>
    ServerAdmin you@yourdomain.com
    DocumentRoot "/path/to/MyApp/public"
    ServerName myapp.dev

    SSLEngine on
    SSLCertificateFile /path/to/MyApp/share/ssl/mysitename.crt
    SSLCertificateKeyFile /path/to/MyApp/share/ssl/mysitename.key

    SetEnv SLIM_MODE development

  </VirtualHost>
</IfModule>

首先定義目錄設置,以便它們與我們站點的 HTTP 和 HTTPS 版本通用。在非安全主機配置中,我使用 mod_rewrite 為任何非安全連接發(fā)出 403 禁止錯誤,然後在安全部分中,我使用我的自簽名證書設置 SSL,以及告訴 Slim 當前應用程序模式的 SLIM_ENV 變量。有關如何在 Apache 上創(chuàng)建自簽名證書並安裝它的更多信息,請參閱 SSLShopper 上的這篇文章。現(xiàn)在我們有了明確的目標、基本目錄結構和服務器設置,讓我們運行 composer.phar install 並開始編寫一些代碼。

引導程序和前端控制器

如前所述,bootstrap.php 文件負責加載我們的應用程序設置和自動加載器設置。

<code>URL             HTTP Method  Operation
/api/contacts   GET          返回聯(lián)系人數(shù)組
/api/contacts/:id GET          返回 ID 為 :id 的聯(lián)系人
/api/contacts   POST         添加一個新聯(lián)系人并返回它(添加了 id 屬性)
/api/contacts/:id PUT          更新 ID 為 :id 的聯(lián)系人
/api/contacts/:id PATCH        部分更新 ID 為 :id 的聯(lián)系人
/api/contacts/:id DELETE       刪除 ID 為 :id 的聯(lián)系人

/api/contacts/:id/star PUT    將 ID 為 :id 的聯(lián)系人添加到收藏夾
/api/contacts/:id/star DELETE 從收藏夾中刪除 ID 為 :id 的聯(lián)系人

/api/contacts/:id/notes GET   返回 ID 為 :id 的聯(lián)系人的筆記
/api/contacts/:id/notes/:nid GET   返回 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記
/api/contacts/:id/notes POST  為 ID 為 :id 的聯(lián)系人添加新筆記
/api/contacts/:id/notes/:nid PUT   更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記
/api/contacts/:id/notes/:nid PATCH  部分更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記
/api/contacts/:id/notes/:nid DELETE 刪除 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記</code>

首先,我獲取當前環(huán)境。如果存在名為 .php 的文件,則加載它,否則加載默認配置文件。 Slim 特定的設置存儲在 $config['app'] 數(shù)組中,並傳遞給擴展基本 Slim 對象的應用程序的構造函數(shù)(可選但推薦)。例如,語句:

{
  "name": "yourname/my-contacts",
  "description": "Simple RESTful API for contacts management",
  "license": "MIT",
  "authors": [
    {
      "name": "Your Name",
      "email": "you@yourdomain.com"
    }
  ],
  "require": {
    "slim/slim": "*",
    "slim/extras": "*",
    "slim/middleware": "*",
    "monolog/monolog": "*",
    "j4mie/paris": "*",
    "flynsarmy/slim-monolog": "*"
  },
  "archive": {
    "exclude": ["vendor", ".DS_Store", "*.log"]
  },
  "autoload": {
    "psr-0": {
      "API": "lib/"
    }
  }
}

配置一個 Monolog 記錄器,該記錄器寫入 app/path/share/logs/EnvName_YYYY-mm-dd.log 的文件。然後,在一些改進之後(您可以在源代碼中看到它們),我獲取生成的日誌寫入器並嘗試連接到數(shù)據(jù)庫:

<code>bootstrap.php
composer.json
README.md
bin/
    import
    install
lib/
    API/
public/
    .htaccess
    index.php
share/
    config/
        default.php
    db/
    logs/
    sql/
        data/
            contacts.sql
            users.sql
        tables/
            contacts.sql
            notes.sql
            users.sql
        ssl/
            mysitename.crt
            mysitename.key</code>

最後,我將所需的中間件添加到我的應用程序實例中。 Slim 的中間件就像洋蔥的層一樣,您添加的第一個中間件將是最內層的,因此我們中間件的順序很重要。我在我們的API 中使用以下中間件:- 緩存(最內層);- ContentTypes:解析來自客戶端的JSON 格式的正文;- RateLimit:管理用戶的API 限制;- JSON:“僅JSON 響應”和“ JSON 編碼正文”最佳實踐的實用程序中間件;- 身份驗證(最外層)。我們將編寫所有這些,除了預先存在的 ContentTypes。在 bootstrap 文件的末尾,我定義了兩個全局變量 $app(應用程序實例)和 $log(日誌寫入器)。該文件由我們的前端控制器 index.php 加載,在該文件中發(fā)生神奇的事情。

路由結構

Slim 有一個名為 Route Groups 的不錯的功能。使用此功能,我們可以像這樣定義我們的應用程序路由:

<Directory>

  # Required for mod_rewrite in .htaccess
  AllowOverride FileInfo

  Options All -Indexes

  DirectoryIndex index.php index.shtml index.html

  <IfModule php5_module="">
    # For Development only!
    php_flag display_errors On
  </IfModule>

  # Enable gzip compression
  <IfModule filter_module="">
    AddOutputFilterByType DEFLATE application/json
  </IfModule>

  Order deny,allow
  Deny from all
  Allow from 127.0.0.1
</Directory>

<VirtualHost *:80>
  ServerAdmin you@yourdomain.com
  DocumentRoot "/path/to/MyApp/public"
  ServerName myapp.dev

  <IfModule rewrite_module="">
    RewriteEngine on

    ## Throw a 403 (forbidden) status for non secure requests
    RewriteCond %{HTTPS} off
    RewriteRule ^.*$ - [L,R=403]
  </IfModule>
</VirtualHost>

<IfModule ssl_module="">

  NameVirtualHost *:443

  Listen 443
  SSLRandomSeed startup builtin
  SSLRandomSeed connect builtin

  <VirtualHost *:443>
    ServerAdmin you@yourdomain.com
    DocumentRoot "/path/to/MyApp/public"
    ServerName myapp.dev

    SSLEngine on
    SSLCertificateFile /path/to/MyApp/share/ssl/mysitename.crt
    SSLCertificateKeyFile /path/to/MyApp/share/ssl/mysitename.key

    SetEnv SLIM_MODE development

  </VirtualHost>
</IfModule>

我創(chuàng)建了兩個嵌套組 /api 和 /v1,因此我們可以輕鬆遵守“URL 中的版本控制”最佳實踐。我還為 /api/ 創(chuàng)建了一些可選路由,其中可能包含用戶可讀的內容,以及一個通用的根 URL(/)URL,在現(xiàn)實世界中,該 URL 可能包含應用程序的公共用戶界面。

JSON 中間件

我最初的方法是在 /v1 組內使用路由中間件(另一種 Slim 中間件),用於身份驗證和 JSON 請求/響應,但我發(fā)現(xiàn)使用經(jīng)典中間件更實用和簡潔。如前所述,中間件是繼承自 SlimMiddleware 的類的實例。 Slim 中間件的 call() 方法是操作發(fā)生的地方,當中間件作為全局中間件鏈接時,它會自動執(zhí)行,使用 $app->add() 方法。

// Init application mode
if (empty($_ENV['SLIM_MODE'])) {
  $_ENV['SLIM_MODE'] = (getenv('SLIM_MODE'))
    ? getenv('SLIM_MODE') : 'development';
}

// Init and load configuration
$config = array();

$configFile = dirname(__FILE__) . '/share/config/'
  . $_ENV['SLIM_MODE'] . '.php';

if (is_readable($configFile)) {
  require_once $configFile;
} else {
  require_once dirname(__FILE__) . '/share/config/default.php';
}

// Create Application
$app = new API\Application($config['app']);

我們的 JSON 中間件實現(xiàn)了兩個最佳實踐:“僅 JSON 響應”和“JSON 編碼正文”。方法如下:

<code>URL             HTTP Method  Operation
/api/contacts   GET          返回聯(lián)系人數(shù)組
/api/contacts/:id GET          返回 ID 為 :id 的聯(lián)系人
/api/contacts   POST         添加一個新聯(lián)系人并返回它(添加了 id 屬性)
/api/contacts/:id PUT          更新 ID 為 :id 的聯(lián)系人
/api/contacts/:id PATCH        部分更新 ID 為 :id 的聯(lián)系人
/api/contacts/:id DELETE       刪除 ID 為 :id 的聯(lián)系人

/api/contacts/:id/star PUT    將 ID 為 :id 的聯(lián)系人添加到收藏夾
/api/contacts/:id/star DELETE 從收藏夾中刪除 ID 為 :id 的聯(lián)系人

/api/contacts/:id/notes GET   返回 ID 為 :id 的聯(lián)系人的筆記
/api/contacts/:id/notes/:nid GET   返回 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記
/api/contacts/:id/notes POST  為 ID 為 :id 的聯(lián)系人添加新筆記
/api/contacts/:id/notes/:nid PUT   更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記
/api/contacts/:id/notes/:nid PATCH  部分更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記
/api/contacts/:id/notes/:nid DELETE 刪除 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記</code>

我們可以將根路徑傳遞給中間件構造函數(shù)。在這種情況下,我傳遞 /api/v1,以便我們的中間件僅應用於我們站點的 API 部分。如果當前路徑與響應內容類型標頭匹配,則強制響應內容類型標頭為 application/json,然後我檢查請求方法。如果請求方法是啟用寫入的請求方法之一(PUT、POST、PATCH),則請求內容類型標頭必須為 application/json,否則應用程序將退出並顯示 415 Unsupported Media Type HTTP 狀態(tài)代碼。如果一切正常,語句 $this->next->call() 將運行鏈中的下一個中間件。

身份驗證

由於我們的應用程序默認情況下將在HTTPS 上運行,因此我決定使用令牌優(yōu)先於基本身份驗證的方法:API 密鑰發(fā)送到基本HTTP AUTH 標頭的用戶名字段中(不需要密碼)。為此,我編寫了一個名為 TokenOverBasicAuth 的 Slim 中間件類,方法是修改現(xiàn)有的 Slim HttpBasicAuth。此中間件首先在鏈中運行,因此它作為最後一個添加,並且它在構造函數(shù)中採用可選的根路徑參數(shù)。

{
  "name": "yourname/my-contacts",
  "description": "Simple RESTful API for contacts management",
  "license": "MIT",
  "authors": [
    {
      "name": "Your Name",
      "email": "you@yourdomain.com"
    }
  ],
  "require": {
    "slim/slim": "*",
    "slim/extras": "*",
    "slim/middleware": "*",
    "monolog/monolog": "*",
    "j4mie/paris": "*",
    "flynsarmy/slim-monolog": "*"
  },
  "archive": {
    "exclude": ["vendor", ".DS_Store", "*.log"]
  },
  "autoload": {
    "psr-0": {
      "API": "lib/"
    }
  }
}

該方法在 PHP_AUTH_USER 請求標頭中搜索 auth 令牌,如果它不存在或無效,則將 401 禁止狀態(tài)和身份驗證標頭傳遞給客戶端。 verify() 方法是受保護的,因此可以由子類覆蓋;我在這裡的版本很簡單:

<code>bootstrap.php
composer.json
README.md
bin/
    import
    install
lib/
    API/
public/
    .htaccess
    index.php
share/
    config/
        default.php
    db/
    logs/
    sql/
        data/
            contacts.sql
            users.sql
        tables/
            contacts.sql
            notes.sql
            users.sql
        ssl/
            mysitename.crt
            mysitename.key</code>

在這裡,我只是檢查 users 表中 API 密鑰的存在,如果我找到一個有效的用戶,則將其添加到應用程序上下文中,以便與下一層(RateLimit)一起使用。您可以修改或擴展此類以注入您自己的身份驗證邏輯或使用 OAuth 模塊。有關 OAuth 的更多信息,請參閱 Jamie Munro 的文章。

可使用的錯誤有效負載

如果可能的話,我們的 API 應該以可使用的格式顯示有用的錯誤消息,最好以 JSON 表示形式。我們需要一個包含錯誤代碼和消息的最小有效負載。此外,驗證錯誤需要更多細分。使用 Slim,我們可以分別使用 $app->notFound() 和 $app->error() 方法重新定義 404 錯誤和服務器錯誤。

<code>URL             HTTP Method  Operation
/api/contacts   GET          返回聯(lián)系人數(shù)組
/api/contacts/:id GET          返回 ID 為 :id 的聯(lián)系人
/api/contacts   POST         添加一個新聯(lián)系人并返回它(添加了 id 屬性)
/api/contacts/:id PUT          更新 ID 為 :id 的聯(lián)系人
/api/contacts/:id PATCH        部分更新 ID 為 :id 的聯(lián)系人
/api/contacts/:id DELETE       刪除 ID 為 :id 的聯(lián)系人

/api/contacts/:id/star PUT    將 ID 為 :id 的聯(lián)系人添加到收藏夾
/api/contacts/:id/star DELETE 從收藏夾中刪除 ID 為 :id 的聯(lián)系人

/api/contacts/:id/notes GET   返回 ID 為 :id 的聯(lián)系人的筆記
/api/contacts/:id/notes/:nid GET   返回 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記
/api/contacts/:id/notes POST  為 ID 為 :id 的聯(lián)系人添加新筆記
/api/contacts/:id/notes/:nid PUT   更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記
/api/contacts/:id/notes/:nid PATCH  部分更新 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記
/api/contacts/:id/notes/:nid DELETE 刪除 ID 為 :id 的聯(lián)系人的 ID 為 :nid 的筆記</code>

找不到錯誤更簡單:首先我獲取請求的媒體類型,然後 $isAPI 標誌告訴我當前 URL 是否位於 /api/v* 組下。如果客戶端請求 API URL 或發(fā)送 JSON 內容類型標頭,我將返回 JSON 輸出,否則我可以呈現(xiàn)模板或簡單地打印一些靜態(tài) HTML,如本例所示。其他錯誤有點棘手,當出現(xiàn)異常時會觸發(fā) $app->error() 方法,Slim 將標準 PHP 錯誤轉換為 ErrorException 對象。我們需要一種方法向客戶端提供有用的錯誤,而不會為了避免安全漏洞而暴露太多內部機制。為此應用程序,我創(chuàng)建了兩個自定義異常,APIException 和 APIExceptionValidationException,它們向公眾公開,所有其他異常類型都記錄在日誌中,並且僅在開發(fā)模式下顯示。

{
  "name": "yourname/my-contacts",
  "description": "Simple RESTful API for contacts management",
  "license": "MIT",
  "authors": [
    {
      "name": "Your Name",
      "email": "you@yourdomain.com"
    }
  ],
  "require": {
    "slim/slim": "*",
    "slim/extras": "*",
    "slim/middleware": "*",
    "monolog/monolog": "*",
    "j4mie/paris": "*",
    "flynsarmy/slim-monolog": "*"
  },
  "archive": {
    "exclude": ["vendor", ".DS_Store", "*.log"]
  },
  "autoload": {
    "psr-0": {
      "API": "lib/"
    }
  }
}

$app->error() 方法接收拋出的異常作為參數(shù)。默認情況下,我獲取所需的所有數(shù)據(jù)並填充 $error 數(shù)組,然後如果我在生產模式下,我將取消設置私有數(shù)據(jù)並使用通用數(shù)據(jù)重寫消息。自定義 ValidationException 類具有自定義 getData() 方法,該方法返回添加到最終有效負載的驗證錯誤數(shù)組。然後,根據(jù)請求以 JSON 或 HTML 顯示錯誤。在 API 端,我們可以有一個簡單的錯誤,如下所示:

<code>bootstrap.php
composer.json
README.md
bin/
    import
    install
lib/
    API/
public/
    .htaccess
    index.php
share/
    config/
        default.php
    db/
    logs/
    sql/
        data/
            contacts.sql
            users.sql
        tables/
            contacts.sql
            notes.sql
            users.sql
        ssl/
            mysitename.crt
            mysitename.key</code>

或完整的驗證錯誤,如下所示:

<Directory>

  # Required for mod_rewrite in .htaccess
  AllowOverride FileInfo

  Options All -Indexes

  DirectoryIndex index.php index.shtml index.html

  <IfModule php5_module="">
    # For Development only!
    php_flag display_errors On
  </IfModule>

  # Enable gzip compression
  <IfModule filter_module="">
    AddOutputFilterByType DEFLATE application/json
  </IfModule>

  Order deny,allow
  Deny from all
  Allow from 127.0.0.1
</Directory>

<VirtualHost *:80>
  ServerAdmin you@yourdomain.com
  DocumentRoot "/path/to/MyApp/public"
  ServerName myapp.dev

  <IfModule rewrite_module="">
    RewriteEngine on

    ## Throw a 403 (forbidden) status for non secure requests
    RewriteCond %{HTTPS} off
    RewriteRule ^.*$ - [L,R=403]
  </IfModule>
</VirtualHost>

<IfModule ssl_module="">

  NameVirtualHost *:443

  Listen 443
  SSLRandomSeed startup builtin
  SSLRandomSeed connect builtin

  <VirtualHost *:443>
    ServerAdmin you@yourdomain.com
    DocumentRoot "/path/to/MyApp/public"
    ServerName myapp.dev

    SSLEngine on
    SSLCertificateFile /path/to/MyApp/share/ssl/mysitename.crt
    SSLCertificateKeyFile /path/to/MyApp/share/ssl/mysitename.key

    SetEnv SLIM_MODE development

  </VirtualHost>
</IfModule>

結論

我們現(xiàn)在已經(jīng)有了 API 的核心。在下一部分中,我們將添加一些內容,以便擁有一個功能齊全的服務。在此期間,請隨時閱讀本部分中鏈接的文章——它們是關於有用 API 設計原則的寶庫。

關於從頭開始構建 REST API 的常見問題解答 (FAQ)

REST API 的關鍵組件是什麼?

REST API 由幾個關鍵組件組成。首先是 HTTP 方法,它定義要執(zhí)行的操作類型。這些包括 GET、POST、PUT、DELETE 等。第二個組件是 URL 或 URI,它是資源標識符。第三個組件是 HTTP 標頭,它承載 HTTP 請求和響應的元數(shù)據(jù)。第四個組件是正文或有效負載,它承載要傳輸?shù)膶嶋H數(shù)據(jù)。最後,狀態(tài)代碼指示 HTTP 請求的成功或失敗。

如何保護我的 REST API?

保護您的 REST API 對於保護敏感數(shù)據(jù)至關重要。您可以使用各種方法,例如 API 密鑰、OAuth 或 JWT 進行身份驗證和授權。此外,始終使用 HTTPS 進行數(shù)據(jù)傳輸,以確保數(shù)據(jù)完整性和機密性。定期更新和修補您的 API 及其依賴項,以防範漏洞。

如何對我的 REST API 進行版本控制?

對您的 REST API 進行版本控制允許您引入非破壞性更改,而不會影響現(xiàn)有客戶端。您可以通過在 URL 中包含版本號或使用自定義請求標頭來對 API 進行版本控制。請記住記錄所有更改並告知您的 API 使用者新版本及其功能。

如何在 REST API 中處理錯誤?

REST API 中正確的錯誤處理提高了其可用性和可靠性。使用 HTTP 狀態(tài)代碼指示錯誤類型。在響應正文中包含錯誤消息,以獲取有關錯誤的更多詳細信息。這有助於客戶端了解出了什麼問題以及如何解決問題。

如何測試我的 REST API?

測試您的 REST API 可確保其按預期工作並可以處理各種場景。您可以使用 Postman 或 curl 等工具進行手動測試。對於自動化測試,請考慮使用單元測試、集成測試和端到端測試。使用模擬服務器來模擬 API 響應並測試您的 API 如何處理不同類型的響應。

如何記錄我的 REST API?

良好的文檔使您的 REST API 易於理解和使用。包括有關端點、請求方法、請求參數(shù)、請求示例、響應狀態(tài)代碼和響應示例的詳細信息。您可以使用 Swagger 或 Postman 等工具來生成和託管您的 API 文檔。

如何設計 RESTful API?

設計 RESTful API 涉及規(guī)劃資源、端點和方法。對資源使用名詞,對操作使用 HTTP 方法。保持 API 簡單直觀。使用狀態(tài)代碼指示請求的結果。使您的 API 無狀態(tài),這意味著每個請求都應包含處理請求所需的所有信息。

如何在我的 REST API 中分頁結果?

分頁有助於限制單個響應中返回的數(shù)據(jù)量。您可以使用諸如“page”和“l(fā)imit”之類的查詢參數(shù)來實現(xiàn)分頁。在響應標頭或正文中包含元數(shù)據(jù),以指示當前頁、總頁數(shù)、總項目數(shù)等。

如何限制我的 REST API 的速率?

速率限制可保護您的 REST API 免受濫用並確保公平使用。您可以根據(jù) IP 地址、API 密鑰或用戶帳戶限制請求數(shù)量。使用 HTTP 標頭將速率限制狀態(tài)傳達給客戶端。

如何部署我的 REST API?

您可以將您的 REST API 部署到服務器或云平臺上。在選擇部署選項時,請考慮成本、可擴展性和安全性等因素。使用持續(xù)集成和持續(xù)交付 (CI/CD) 工具來自動化部署過程。監(jiān)控您的 API 性能和使用情況,以確保它滿足用戶的需求。

以上是從頭開始構建REST API:簡介的詳細內容。更多資訊請關注PHP中文網(wǎng)其他相關文章!

本網(wǎng)站聲明
本文內容由網(wǎng)友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
PHP變量範圍解釋了 PHP變量範圍解釋了 Jul 17, 2025 am 04:16 AM

PHP變量作用域常見問題及解決方法包括:1.函數(shù)內部無法訪問全局變量,需使用global關鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次並在多次調用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過濾;4.匿名函數(shù)需通過use關鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助於避免錯誤並提升代碼穩(wěn)定性。

如何在PHP中牢固地處理文件上傳? 如何在PHP中牢固地處理文件上傳? Jul 08, 2025 am 02:37 AM

要安全處理PHP文件上傳需驗證來源與類型、控製文件名與路徑、設置服務器限制並二次處理媒體文件。 1.驗證上傳來源通過token防止CSRF並通過finfo_file檢測真實MIME類型使用白名單控制;2.重命名文件為隨機字符串並根據(jù)檢測類型決定擴展名存儲至非Web目錄;3.PHP配置限制上傳大小及臨時目錄Nginx/Apache禁止訪問上傳目錄;4.GD庫重新保存圖片清除潛在惡意數(shù)據(jù)。

在PHP中評論代碼 在PHP中評論代碼 Jul 18, 2025 am 04:57 AM

PHP註釋代碼常用方法有三種:1.單行註釋用//或#屏蔽一行代碼,推薦使用//;2.多行註釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧註釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時需注意閉合符號和避免嵌套。

發(fā)電機如何在PHP中工作? 發(fā)電機如何在PHP中工作? Jul 11, 2025 am 03:12 AM

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

撰寫PHP評論的提示 撰寫PHP評論的提示 Jul 18, 2025 am 04:51 AM

寫好PHP註釋的關鍵在於明確目的與規(guī)範,註釋應解釋“為什麼”而非“做了什麼”,避免冗餘或過於簡單。 1.使用統(tǒng)一格式,如docblock(/*/)用於類、方法說明,提升可讀性與工具兼容性;2.強調邏輯背後的原因,如說明為何需手動輸出JS跳轉;3.在復雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標記待辦事項與問題,便於後續(xù)追蹤與協(xié)作。好的註釋能降低溝通成本,提升代碼維護效率。

快速PHP安裝教程 快速PHP安裝教程 Jul 18, 2025 am 04:52 AM

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

如何通過php中的索引訪問字符串中的字符 如何通過php中的索引訪問字符串中的字符 Jul 12, 2025 am 03:15 AM

在PHP中獲取字符串特定索引字符可用方括號或花括號,但推薦方括號;索引從0開始,超出範圍訪問返回空值,不可賦值;處理多字節(jié)字符需用mb_substr。例如:$str="hello";echo$str[0];輸出h;而中文等字符需用mb_substr($str,1,1)獲取正確結果;實際應用中循環(huán)訪問前應檢查字符串長度,動態(tài)字符串需驗證有效性,多語言項目建議統(tǒng)一使用多字節(jié)安全函數(shù)。

學習PHP:初學者指南 學習PHP:初學者指南 Jul 18, 2025 am 04:54 AM

易於效率,啟動啟動tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

See all articles