什么是Rest

REST 代表 Representational State Transfer,它是一組用于設(shè)計(jì)可擴(kuò)展、統(tǒng)一和無(wú)狀態(tài)的 Web 服務(wù)的約束和指南。 REST 的一些主要原則是:

REST全稱是表述性狀態(tài)轉(zhuǎn)移,那究竟指的是什么的表述? 其實(shí)指的就是資源。任何事物,只要有被引用到的必要,它就是一個(gè)資源。

什么是資源?

資源是任何可以通過(guò) URI(統(tǒng)一資源標(biāo)識(shí)符)標(biāo)識(shí)的東西,例如用戶、產(chǎn)品、博客文章等。資源可以有不同的表示形式,例如 JSON、XML、HTML 等。例如,資源 https://example.com/users/1 可以表示為 JSON 對(duì)象:

{
"id": 1,
"name": "Alice",
"email": "alice@example.com"
}

或者作為 XML 文檔:

<user>
<id>1</id>
<name>Alice</name>
<email>alice@example.com</email>
</user>

或者作為 HTML 頁(yè)面:

<h1>User Profile</h1>
<p>ID: 1</p>
<p>Name: Alice</p>
<p>Email: alice@example.com</p>

如何使用 PHP 創(chuàng)建 RESTful Web 服務(wù)?

任何一個(gè) RESTful Web 服務(wù),創(chuàng)建時(shí)都至少需要做以下4部分工作:

定義您的資源及其 URI

第一步是確定您的 Web 服務(wù)將提供的資源并為它們分配有意義的 URI。例如,假設(shè)我們要?jiǎng)?chuàng)建一個(gè)用于管理博客文章的 Web 服務(wù)。您可以定義以下資源:

這里我們應(yīng)該使用名詞來(lái)命名資源并避免使用動(dòng)詞。還應(yīng)該對(duì)集合使用復(fù)數(shù)形式,對(duì)單個(gè)資源使用單數(shù)形式。應(yīng)該使用路徑參數(shù) ( {id} ) 來(lái)標(biāo)識(shí)集合中的特定資源。

為每個(gè)資源實(shí)現(xiàn) HTTP 方法

下一步是使用適當(dāng)?shù)?HTTP 方法為每個(gè)資源實(shí)現(xiàn)邏輯。 HTTP 方法是:

例如,可以為 /posts 資源實(shí)現(xiàn)以下方法:

我們可以為其他資源實(shí)施類似的方法。您應(yīng)該遵循 HTTP 約定并使用狀態(tài)代碼來(lái)指示每個(gè)請(qǐng)求的結(jié)果。例如:

處理請(qǐng)求和響應(yīng)格式

下一步是處理 Web 服務(wù)的請(qǐng)求和響應(yīng)格式。應(yīng)該根據(jù)客戶的需要支持不同的格式。例如,可以支持 JSON、XML、HTML 等。也應(yīng)該使用內(nèi)容協(xié)商來(lái)根據(jù)請(qǐng)求的 Accept 標(biāo)頭和響應(yīng)的 Content-Type 標(biāo)頭來(lái)確定要使用的格式。
例如,如果你想為你的網(wǎng)絡(luò)服務(wù)支持 JSON 和 XML 格式,你可以這樣寫:

// Get the accept header from the request
$accept = $_SERVER['HTTP_ACCEPT'];

// Set default format to JSON
$format = 'json';

// Check if XML format is requested
if (strpos($accept,'application/xml') !== false) {
// Set format to XML
$format = 'xml';
}

// Set content type header according to format
header('Content-Type: application/' . $format);

// Encode data according to format
if ($format == 'json') {
// Encode data as JSON
echo json_encode($data);
} else if ($format == 'xml') {
// Encode data as XML
echo xml_encode($data); // You need to implement this function yourself
}

還應(yīng)該根據(jù)客戶將數(shù)據(jù)發(fā)送到 Web 服務(wù)的方式來(lái)處理不同的請(qǐng)求格式。例如,您可以支持 JSON、XML、表單數(shù)據(jù)等。您應(yīng)該再次使用內(nèi)容協(xié)商來(lái)根據(jù)請(qǐng)求的 Content-Type 標(biāo)頭來(lái)確定使用哪種格式。

// Get content type header from request
$content_type = $_SERVER['CONTENT_TYPE'];

// Set default format to JSON
$format = 'json';

// Check if XML format is sent
if (strpos($content_type,'application/xml') !== false) {
// Set format to XML
$format = 'xml';
}

// Decode data according to format
if ($format == 'json') {
// Decode data from JSON
$data = json_decode(file_get_contents('php://input'), true);
} else if ($format == 'xml') {
// Decode data from XML
$data = xml_decode(file_get_contents('php://input')); // You need to implement this function yourself
}

當(dāng)然,現(xiàn)代php開(kāi)發(fā)都基于如Laravel這樣的知名框架來(lái)開(kāi)發(fā),在框架里面,這些請(qǐng)求格式,請(qǐng)求頭都非常容易獲取,一般都是通過(guò)使用中間件技術(shù)來(lái)實(shí)現(xiàn)

處理錯(cuò)誤和異常

最后一步是處理處理請(qǐng)求時(shí)可能出現(xiàn)的任何錯(cuò)誤和異常。您應(yīng)該使用 try-catch 塊來(lái)捕獲您的代碼或外部庫(kù)可能拋出的任何異常。您還應(yīng)該使用錯(cuò)誤處理程序來(lái)捕獲可能由 PHP 本身觸發(fā)的任何錯(cuò)誤。您應(yīng)該在響應(yīng)中返回有意義的錯(cuò)誤消息和狀態(tài)代碼。
例如,您可以使用這樣的東西:

// Set error handler function
set_error_handler('error_handler');

// Define error handler function
function error_handler($errno, $errstr) {
// Log error message
error_log($errstr);

// Set status code header to 500 Internal Server Error
http_response_code(500);

// Return error message in JSON format
echo json_encode(['error' => $errstr]);
}

// Use try-catch block around your code
try {
// Your code here ...
} catch (Exception $e) {
// Log exception message
error_log($e->getMessage());

// Set status code header according to exception type
switch (get_class($e)) {
case 'InvalidArgumentException':
http_response_code(400);
break;
case 'UnauthorizedException':
http_response_code(401);
break;
case 'ForbiddenException':
http_response_code(403);
break;
case 'NotFoundException':
http_response_code(404);
break;
default:
http_response_code(500);
break;
}

// Return exception message in JSON format
echo json_encode(['error' => $e->getMessage()]);
}

在現(xiàn)代php開(kāi)發(fā)中,通過(guò)使用框架,使用框架中的自動(dòng)異常捕獲技術(shù),只需做一些簡(jiǎn)單的配置,就可以輕松處理程序錯(cuò)誤和運(yùn)行時(shí)異常

總結(jié)

在本文中,我們學(xué)習(xí)了如何使用 PHP 創(chuàng)建簡(jiǎn)單的 RESTful Web 服務(wù)。學(xué)習(xí)了如何定義資源及其 URI、如何為每個(gè)資源實(shí)現(xiàn) HTTP 方法、如何處理請(qǐng)求和響應(yīng)格式以及如何處理錯(cuò)誤和異常。還看到了一些說(shuō)明這些概念的代碼示例。
使用 PHP 創(chuàng)建 RESTful Web 服務(wù)并不難,但需要注意細(xì)節(jié)和一些最佳實(shí)踐。在設(shè)計(jì)和實(shí)現(xiàn) Web 服務(wù)時(shí),應(yīng)該始終遵循 REST 原則和 HTTP 約定。還應(yīng)該做好 Web 服務(wù)的測(cè)試,感謝你的閱讀,希望本文能夠幫助到你!

文章轉(zhuǎn)自微信公眾號(hào)@老俊說(shuō)技術(shù)

上一篇:

把 C# 里的 HttpClient 封裝起來(lái),告別復(fù)雜的配置,讓 Restful API 調(diào)用更輕松更高效

下一篇:

VB.NET 創(chuàng)建ASP.NET WebAPI及應(yīng)用(一)
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)