国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

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

從頭開始構(gòu)建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 徹底改變,這是有充分理由的。通過在產(chǎn)品或服務中使用第三方 API,您可以訪問大量有用的功能——例如身份驗證或存儲服務——這些功能對您和您的用戶都有利。通過公開您自己的 API,您的應用程序?qū)⒊蔀椤敖M合的一部分”,并以您從未想過的方式使用……當然,如果您以正確的方式這樣做。在這個由兩部分組成的系列文章中,我將向您展示如何使用一系列真實的最佳實踐為您的 PHP 應用程序創(chuàng)建 RESTful API 層。本項目完整的源代碼將在第 2 部分的結(jié)尾提供。

關鍵要點

  • REST API 對現(xiàn)代 Web 服務至關重要,它為開發(fā)人員提供了一個用戶友好的界面來訪問和操作應用程序數(shù)據(jù)。
  • 文檔至關重要;它應該從總結(jié) API 范圍并詳細說明訪問點和方法的 README 文件開始。
  • Slim Framework 與 Idiorm 和 Monolog 等工具結(jié)合使用,可以利用強大的路由和中間件集成功能來促進高效的 API 開發(fā)。
  • 實施 HTTPS 可確保安全通信,防止未經(jīng)授權(quán)訪問客戶端和服務器之間傳輸?shù)臄?shù)據(jù)。
  • 以 JSON 格式實現(xiàn)結(jié)構(gòu)化錯誤處理可增強 API 的可用性,提供清晰的錯誤消息和代碼,有助于調(diào)試和集成。
  • 通過令牌優(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 等工具:您的用戶會喜歡您的!

工具和設置

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

這是真的。其強大的路由功能使使用 GET 和 POST 以外的方法變得容易,它提供對 HTTP 方法覆蓋的內(nèi)置支持(通過 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 包提供了諸如內(nèi)容類型解析和基本身份驗證之類的有用功能。我們的自定義類位于 API 命名空間下,位于 lib 目錄中。此時,我們的工作目錄結(jié)構(gòu)如下所示:

<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ù)庫和轉(zhuǎn)儲文件以及 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)在我們有了明確的目標、基本目錄結(jié)構(gòu)和服務器設置,讓我們運行 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 對象的應用程序的構(gòu)造函數(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>

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

路由結(jié)構(gòu)

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)建了一些可選路由,其中可能包含用戶可讀的內(nèi)容,以及一個通用的根 URL(/)URL,在現(xiàn)實世界中,該 URL 可能包含應用程序的公共用戶界面。

JSON 中間件

我最初的方法是在 /v1 組內(nèi)使用路由中間件(另一種 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>

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

身份驗證

由于我們的應用程序默認情況下將在 HTTPS 上運行,因此我決定使用令牌優(yōu)先于基本身份驗證的方法:API 密鑰發(fā)送到基本 HTTP AUTH 標頭的用戶名字段中(不需要密碼)。為此,我編寫了一個名為 TokenOverBasicAuth 的 Slim 中間件類,方法是修改現(xiàn)有的 Slim HttpBasicAuth。此中間件首先在鏈中運行,因此它作為最后一個添加,并且它在構(gòu)造函數(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 內(nèi)容類型標頭,我將返回 JSON 輸出,否則我可以呈現(xiàn)模板或簡單地打印一些靜態(tài) HTML,如本例所示。其他錯誤有點棘手,當出現(xiàn)異常時會觸發(fā) $app->error() 方法,Slim 將標準 PHP 錯誤轉(zhuǎn)換為 ErrorException 對象。我們需要一種方法向客戶端提供有用的錯誤,而不會為了避免安全漏洞而暴露太多內(nèi)部機制。為此應用程序,我創(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ù)組,然后如果我在生產(chǎn)模式下,我將取消設置私有數(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>

結(jié)論

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

關于從頭開始構(gòu)建 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 進行身份驗證和授權(quán)。此外,始終使用 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)代碼指示請求的結(jié)果。使您的 API 無狀態(tài),這意味著每個請求都應包含處理請求所需的所有信息。

如何在我的 REST API 中分頁結(jié)果?

分頁有助于限制單個響應中返回的數(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 性能和使用情況,以確保它滿足用戶的需求。

以上是從頭開始構(gòu)建REST API:簡介的詳細內(nèi)容。更多信息請關注PHP中文網(wǎng)其他相關文章!

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應用程序,用于創(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)

如何在PHP中實施身份驗證和授權(quán)? 如何在PHP中實施身份驗證和授權(quán)? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在于驗證文件類型、重命名文件并限制權(quán)限。1.使用finfo_file()檢查真實MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機文件名,存儲至非Web根目錄;3.通過php.ini和HTML表單限制文件大小,設置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

PHP中==(松散比較)和===(嚴格的比較)之間有什么區(qū)別? PHP中==(松散比較)和===(嚴格的比較)之間有什么區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在于類型檢查的嚴格程度。==在比較前會進行類型轉(zhuǎn)換,例如5=="5"返回true,而===要求值和類型都相同才會返回true,例如5==="5"返回false。使用場景上,===更安全應優(yōu)先使用,==僅在需要類型轉(zhuǎn)換時使用。

如何在PHP( - , *, /,%)中執(zhí)行算術操作? 如何在PHP( - , *, /,%)中執(zhí)行算術操作? Jun 19, 2025 pm 05:13 PM

PHP中使用基本數(shù)學運算的方法如下:1.加法用 號,支持整數(shù)和浮點數(shù),也可用于變量,字符串數(shù)字會自動轉(zhuǎn)換但不推薦依賴;2.減法用-號,變量同理,類型轉(zhuǎn)換同樣適用;3.乘法用*號,適用于數(shù)字及類似字符串;4.除法用/號,需避免除以零,并注意結(jié)果可能是浮點數(shù);5.取模用%號,可用于判斷奇偶數(shù),處理負數(shù)時余數(shù)符號與被除數(shù)一致。正確使用這些運算符的關鍵在于確保數(shù)據(jù)類型清晰并處理好邊界情況。

如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過特定擴展或庫與MongoDB和Redis等NoSQL數(shù)據(jù)庫交互。首先,使用MongoDBPHP驅(qū)動(通過PECL或Composer安裝)創(chuàng)建客戶端實例并操作數(shù)據(jù)庫及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫或phpredis擴展連接Redis,執(zhí)行鍵值設置與獲取,推薦phpredis用于高性能場景,Predis則便于快速部署;兩者均適用于生產(chǎn)環(huán)境且文檔完善。

我如何了解最新的PHP開發(fā)和最佳實踐? 我如何了解最新的PHP開發(fā)和最佳實踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什么是PHP,為什么它用于Web開發(fā)? 什么是PHP,為什么它用于Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設置PHP時區(qū)? 如何設置PHP時區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

See all articles