如何使用PHP,Slim和MySQL創建REST API 第一部分

本教程提供了有關為初學者構建REST API的足夠知識。我將其分為兩部分。在第1部分中,我們將學習REST的基本概念並進行必要的設置。在第二部分構建實際的API(編寫PHP和MySQL代碼)。

1. REST API設計的基礎知識

REST架構對於構建客戶端/服務器網絡應用程序非常有用。REST代表具象狀態轉移。與SOAP,CORBA,WSDL等其他方法相比,實現REST非常簡單,它基本上適用於HTTP協議。

如何使用PHP,Slim和MySQL創建REST API 第一部分

以下是構建REST API時應考慮的事項列表。

HTTP方法

設計良好的RESTful API應該支持最常用的HTTP方法(GET,POST,PUT和DELETE)。還有其他HTTP方法,如OPTIONS,HEAD,但最常使用這些方法。應根據您執行的操作類型使用每種方法。

GET To fetch a resource 獲取資源

POSTTo create a new resource 創建新資源

PUT To update existing resource 更新現有資源

DELETETo delete a resource 刪除資源

HTTP狀態代碼

響應正文中的HTTP狀態代碼告訴客戶端應用程序應對響應採取什麼操作。例如,如果響應代碼200,則表示在服務器端成功處理了請求,您可以期待響應中的更新數據。如果狀態代碼為401,則該請求未被授權。401的示例原因可能是api密鑰無效。

沒有必要支持所有HTTP狀態代碼,但至少支持以下代碼應該足夠好。查看來自restapitutorial.com和Wikipedia的http代碼列表。

200OK

201Created

304Not Modified

400Bad Request

401Unauthorized

403Forbidden

404Not Found

422Unprocessable Entity

500Internal Server Error

URL結構

在REST設計中,URL端點應該格式良好,並且應該易於理解。應唯一標識資源的每個URL。如果您的API需要訪問API密鑰,則應將api密鑰保存在HTTP標頭中,而不是將其包含在URL中。

例如:

GET http://abc.com/v1/tasks/11 - 將提供id為11的任務的詳細信息

POST http://abc.com/v1/tasks -將創建一個新的任務

API版本

有一個巨大的討論,對API的版本是否在URL或HTTP請求頭保持API的版本。儘管建議應該在請求標頭中包含版本,但我覺得將其保存在URL本身很舒服,因為在客戶端從一個版本遷移到另一個版本非常方便。

例如:

http://abc.com/ V1 /任務

http://abc.com/ V2 /任務

內容類型

在HTTP頭中的內容類型指定的種類的數據的應服務器和客戶端之間傳遞。根據您支持的API所需的數據來設置內容類型。

例如,JSON Mime類型應為Content-Type:application / json,用於XML Content-Type:application / xml。

API密鑰

如果您要構建一個私有API,您希望限制訪問或限制私有訪問,最好的方法是使用API密鑰保護您的API。本文設計一個沒有OAuth的安全REST(Web)API由Riyad Kalla提供保護您休息api的最佳方法。但是,由於本文針對初學者,我不會使用任何複雜的模型。所以現在我們可以為每個用戶生成一個隨機的api密鑰。用戶由api密鑰標識,並且所有動作只能在屬於他的資源上執行。

API密鑰應保存在請求標頭授權文件中,而不是通過URL傳遞。

Authorization授權: bf45c093e542f057caee68c47787e7d6

有關REST API設計的更多知識

以下鏈接將向您解釋REST和其他原則的最佳實踐。

1)RESTful Web服務:基礎知識

https://developer.ibm.com/technologies/web-development/

2)Stackoverflow 討論https://stackoverflow.com/questions/671118/what-exactly-is-restful-programming

2.先決條件

在深入學習本文之前,建議您具備PHP,MySQL,JSON解析。通過以下鏈接獲取基本知識。

1)PHP基礎

http://www.w3schools.com/php/

2)MySQL的預處理語句

http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php

3. Slim PHP Micro Framework

而不是從頭開始開發新的REST框架,最好使用已經過驗證的框架。然後我遇到了Slim框架並選擇了它,原因如下。

1)它重量很輕,乾淨,初學者可以很容易地理解框架。

2)支持REST API所需的所有HTTP方法GET,POST,PUT和DELETE。

3)更重要的是,它提供了一箇中間層架構,可用於過濾請求。在我們的例子中,我們可以使用它來驗證API密鑰。

下載Slim Framework

從這裡 https://github.com/codeguy/Slim

下載Slim框架(下載穩定版本)並將其放在一邊。在完成所需的設置後,我們稍後會需要這一點。

4.安裝WAMP服務器(Apache,PHP和MySQL)

WAMP允許您使用單個安裝程序安裝Apache,PHP和MySQL,從而減少單獨安裝和配置它們的負擔。或者,您可以使用XAMP,LAMP(在Linux上)和MAMP(在MAC上)。WAMP還為您提供了phpmyadmin,可以輕鬆地與MySQL數據庫進行交互。

從http://www.wampserver.com/en/下載並安裝WAMP 。選擇適合您操作系統的正確版本(32位或64位)。安裝後,從“ 開始” - >“所有程序” - >“Wamp Server” - >“啟動WampServer”打開該程序。

5.安裝Chrome Advanced REST客戶端擴展以進行測試

Chrome Advanced REST客戶端擴展提供了一種測試REST API的簡便方法。它提供了很多選項,例如添加請求標頭,添加請求參數,在訪問URL時更改HTTP方法。在Chrome瀏覽器中安裝高級REST客戶端擴展。安裝後,您可以在Chrome應用程序或右上角的圖標中找到它。

或者,如果您更喜歡使用firefox,可以使用Poster插件來測試API。

我使用的是Postman插件。

6.任務管理器應用程序的REST API

為了演示REST API,我正在考慮具有非常小功能的任務管理器應用程序的示例。

1)用戶相關的操作,如註冊和登錄

2)與任務相關的操作,如創建,讀取,更新和刪除任務。所有與任務相關的API調用都應包含Authorization標頭字段中的API密鑰。

以下是我們將在本教程中構建的API調用列表。您可以注意到,相同的url端點用於多個api調用,但區別在於我們用於訪問URL的HTTP方法的類型。假設我們使用POST方法命中/ tasks,將創建一個更新的任務。如果我們使用GET方法命中/任務,則將列出所有任務。

API網址結構

URL Method Parameters Description

/register POST name, email, password User registration 用戶註冊

/login POST email, password User login 用戶登錄

/tasks POST task To create new task 創建新任務

/tasks GET Fetching all tasks 獲取所有任務

/tasks/:idGET Fetching single task 獲取單個任務

/tasks/:idPUT Updating single task 更新單個任務

/tasks/:idDELETEtask, status Deleting single task 刪除單個任務

7.創建MySQL數據庫

對於這個應用程序,我們不需要複雜的數據庫設計。在這個階段我們只需要三張表。如果要擴展功能,可以隨時添加更多表。我創建了三個表 users, tasks和user_tasks。

用戶users - 所有與用戶相關的數據都將存儲在此處。當新用戶在我們的應用程序中註冊時,將插入一行。

任務 tasks- 所有用戶任務數據將存儲在此表。

user_tasks中 - 用於存儲用戶與其任務之間關係的表。基本上我們將用戶ID和任務ID存儲在此表中。

如何使用PHP,Slim和MySQL創建REST API 第一部分


從http:// localhost / phpmyadmin打開phpmyadmin並執行以下SQL查詢。如果您熟悉phpmyadmin,也可以使用phpmyadmin圖形界面來創建表格。

我用的是Navicat。

CREATE DATABASE task_manager;

USE task_manager;

CREATE TABLE IF NOT EXISTS `users` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(250) DEFAULT NULL,

`email` varchar(255) NOT NULL,

`password_hash` text NOT NULL,

`api_key` varchar(32) NOT NULL,

`status` int(1) NOT NULL DEFAULT '1',

`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (`id`),

UNIQUE KEY `email` (`email`)

);

CREATE TABLE IF NOT EXISTS `tasks` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`task` text NOT NULL,

`status` int(1) NOT NULL DEFAULT '0',

`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (`id`)

);

CREATE TABLE IF NOT EXISTS `user_tasks` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`user_id` int(11) NOT NULL,

`task_id` int(11) NOT NULL,

PRIMARY KEY (`id`),

KEY `user_id` (`user_id`),

KEY `task_id` (`task_id`)

);

ALTER TABLE `user_tasks` ADD FOREIGN KEY ( `user_id` ) REFERENCES `task_manager`.`users` (

`id`

) ON DELETE CASCADE ON UPDATE CASCADE ;

ALTER TABLE `user_tasks` ADD FOREIGN KEY ( `task_id` ) REFERENCES `task_manager`.`tasks` (

`id`

) ON DELETE CASCADE ON UPDATE CASCADE ;

結果:

如何使用PHP,Slim和MySQL創建REST API 第一部分


到目前為止,我們已經完成了讓您的系統為開發做好準備。下一篇文章如何使用PHP,Slim和MySQL創建REST API - 第2部分介紹了啟動和完成PHP和MySQL項目的整個過程。


分享到:


相關文章: