REST API詳解:輕鬆理解最常用的網絡服務技術
REST,代表“具象狀態傳輸”(Representational State Transfer),是目前應用最廣泛的網絡服務技術。儘管其名稱略顯抽象,但REST API實質上是兩種計算機系統之間利用網頁瀏覽器和服務器中常見的HTTP技術進行通信的一種方式。
軟件開發中,系統間的數據共享始終是基本需求。例如,購買汽車保險時,保險公司需要獲取您的個人信息和車輛信息,因此需要向車輛登記機構、信用機構、銀行和其他系統請求數據。所有這些都在實時透明地進行,以確定保險公司能否提供具有競爭力的保單。
API(應用程序編程接口)通過提供系統間通信的接口來實現這種系統間的通信。 REST僅僅是一種被廣泛採用的API風格,我們用它以一致且可預測的方式與內部和外部各方進行通信。這可以比作我們過去如何以某種方式發送帶有郵票、地址和信封的信件,以確保其被送達並閱讀。
REST常用於網絡系統中的人員互動,例如在社交媒體應用程序中檢索和更新帳戶信息。
在瀏覽器中打開以下鏈接,即可從開放瑣事數據庫請求一個隨機的計算機問題:
https://www.php.cn/link/bf13848f7f02f488b2e12e009a8b0df3
這是一個作為RESTful Web服務實現的公共API(它遵循REST約定)。您的瀏覽器將顯示一個包含答案的單個JSON格式的測驗問題,例如:
<code>{ "response_code": 0, "results": [ { "category": "Science: Computers", "type": "multiple", "difficulty": "easy", "question": "What does GHz stand for?", "correct_answer": "Gigahertz", "incorrect_answers": [ "Gigahotz", "Gigahetz", "Gigahatz" ] } ] }</code>
您可以使用任何HTTP客戶端(例如curl)請求相同的URL並獲取響應:
<code>curl "https://www.php.cn/link/bf13848f7f02f488b2e12e009a8b0df3"</code>
所有流行的語言和運行時環境中都提供HTTP客戶端庫,包括JavaScript、Node.js和Deno中的Fetch以及PHP中的file_get_contents()
。 JSON響應是機器可讀的,因此可以在輸出HTML或其他格式之前對其進行解析和使用。
多年來,各種數據通信標準不斷發展。您可能遇到過CORBA、SOAP或XML-RPC等選項。大多數都制定了嚴格的消息規則。
REST由Roy Fielding於2000年定義,比其他技術簡單得多。它不是一個標準,而是一套關於RESTful Web服務的建議和約束。這些包括:
RESTful Web服務請求包含:
端點URL。實現RESTful API的應用程序將定義一個或多個URL端點,包括域名、端口、路徑和/或查詢字符串——例如,https://mydomain/user/123?format=json
。
HTTP方法。任何端點都可以使用不同的HTTP方法,這些方法對應於應用程序的創建、讀取、更新和刪除(CRUD)操作:
HTTP方法
CRUD
操作
GET
讀取
返回請求的數據
POST
創建
創建一個新記錄
PUT或PATCH
更新
更新現有記錄
DELETE
刪除
刪除現有記錄
示例:
/user/
的GET請求返回系統上註冊用戶的列表/user/
的POST請求使用主體數據創建ID為123的用戶(見下面的4.)。響應返回ID。 /user/123
的PUT請求使用主體數據更新用戶123(見下面的4.)/user/123
的GET請求返回用戶123的詳細信息/user/123
的DELETE請求刪除用戶123HTTP標頭。身份驗證令牌或cookie等信息可以包含在HTTP請求標頭中。
主體數據。數據通常以與HTML提交相同的方式通過HTTP主體傳輸,或者通過發送單個JSON編碼的數據字符串來傳輸。
響應有效負載可以是任何實用的內容:數據、HTML、圖像、音頻文件等等。數據響應通常是JSON編碼的,但也可以使用XML、CSV、簡單的字符串或任何其他格式。您可以允許在請求中指定返回格式——例如,/user/123?format=json
或/user/123?format=xml
。
還應在響應標頭中設置適當的HTTP狀態代碼。 200 OK用於成功的請求,儘管在創建記錄時也可以返回201 Created。錯誤應返回適當的代碼,例如400 Bad Request、404 Not Found、401 Unauthorized等等。
可以設置其他HTTP標頭,包括Cache-Control或Expires指令,以指定在響應被認為是“陳舊”之前可以緩存多長時間。
但是,沒有嚴格的規則。端點URL、HTTP方法、主體數據和響應類型可以根據您的喜好進行實現。例如,POST、PUT和PATCH經常互換使用,因此任何一個都會根據需要創建或更新記錄。
以下Node.js代碼使用Express框架創建一個RESTful Web服務。單個/hello/
端點響應HTTP GET請求。
確保已安裝Node.js,然後創建一個名為restapi
的新文件夾。在此文件夾中創建一個新的package.json
文件,內容如下:
<code>{ "response_code": 0, "results": [ { "category": "Science: Computers", "type": "multiple", "difficulty": "easy", "question": "What does GHz stand for?", "correct_answer": "Gigahertz", "incorrect_answers": [ "Gigahotz", "Gigahetz", "Gigahatz" ] } ] }</code>
從命令行運行npm install
以獲取依賴項,然後創建一個包含以下代碼的index.js
文件:
<code>curl "https://www.php.cn/link/bf13848f7f02f488b2e12e009a8b0df3"</code>
使用npm start
從命令行啟動應用程序,並在瀏覽器中打開http://localhost:8888/hello/
。響應GET請求將顯示以下JSON:
<code>{ "name": "restapi", "version": "1.0.0", "description": "REST test", "scripts": { "start": "node ./index.js" }, "dependencies": { "express": "4.18.1" } }</code>
API還允許自定義名稱,因此http://localhost:8888/hello/everyone/
返回:
<code class="language-javascript">// simple Express.js RESTful API 'use strict'; // initialize const port = 8888, express = require('express'), app = express(); // /hello/ GET request app.get('/hello/:name?', (req, res) => res.json( { message: `Hello ${req.params.name || 'world'}!` } ) ); // start server app.listen(port, () => console.log(`Server started on port ${port}`); );</code>
考慮在瀏覽器中以URL http://localhost:8888/
啟動的以下HTML頁面:
<code class="language-json">{ "message": "Hello world!" }</code>
fetch調用執行相同的API請求,瀏覽器控制台將顯示Object { message: "Hello world!" }
,正如您預期的那樣。
但是,假設您的RESTful Web服務現在在Web上的http://mydomain.com/hello/
域名上上線了。頁面JavaScript fetch()
URL相應地更改,但是現在在瀏覽器中打開http://localhost:8888/
會返回控制台錯誤Cross-Origin Request Blocked
。
出於安全原因,瀏覽器只允許客戶端XMLHttpRequest和Fetch API調用與調用頁面託管在同一域。
幸運的是,跨源資源共享(CORS)允許我們規避該安全限制。設置Access-Control-Allow-Origin
HTTP響應標頭告訴瀏覽器允許請求。它可以設置為特定域名或*
(表示所有域名)(如上面的測驗API所示)。
可以更改Web服務API代碼以允許訪問在任何域名上運行的任何客戶端腳本:
<code>{ "response_code": 0, "results": [ { "category": "Science: Computers", "type": "multiple", "difficulty": "easy", "question": "What does GHz stand for?", "correct_answer": "Gigahertz", "incorrect_answers": [ "Gigahotz", "Gigahetz", "Gigahatz" ] } ] }</code>
或者,可以使用Express.js中間件函數將標頭附加到每個端點請求:
<code>curl "https://www.php.cn/link/bf13848f7f02f488b2e12e009a8b0df3"</code>
請注意,瀏覽器會向REST API發出兩個請求:
Access-Control-Allow-Origin
HTTP響應標頭是否有效當您的服務器接收到OPTIONS請求方法時,它可以設置Access-Control-Allow-Origin
HTTP響應標頭,並返回一個虛擬的空響應,以確保不會重複工作。
REST的成功很大程度上歸功於其簡單性。開發人員可以根據自己的喜好實現RESTful API,但這可能會導致進一步的挑戰。有關實施策略的深入了解,請查看我們關於構建RESTful API的13個最佳實踐。
考慮以下端點:
/user/123
/user/id/123
/user/?id=123
所有這些都是獲取用戶123數據的有效選項。當您進行更複雜的運算時,組合的數量會進一步增加。例如,返回十個姓氏以“A”開頭並在companyX工作的用戶,按出生日期倒序排列,從第51條記錄開始。
最終,您如何格式化URL並不重要,但API的一致性非常重要。對於擁有許多開發人員的大型代碼庫來說,這可能是一項挑戰。
API更改是不可避免的,但端點URL永遠不應該失效,否則會破壞使用它們的應用程序。
API通常採用版本控制以避免兼容性問題。例如,/2.0/user/123
取代/user/123
。新的和舊的端點都可以保持活動狀態。不幸的是,這隨後需要維護多個歷史API。舊版本最終可以被丟棄,但此過程需要仔細規劃。
上面顯示的測驗API是開放的:任何系統都可以無需授權即可獲取笑話。對於訪問私有數據或允許更新和刪除請求的API來說,這是不可行的。
與RESTful API位於同一域的客戶端應用程序將發送和接收cookie,就像任何其他HTTP請求一樣。 (請注意,舊版瀏覽器中的Fetch()需要設置credentials
初始化選項。)因此,可以驗證API請求以確保用戶已登錄並擁有相應的權限。
第三方應用程序必須使用其他身份驗證方法。常見身份驗證選項包括:
API身份驗證將根據使用環境而有所不同:
RESTful API提供了訪問和操作應用程序的另一種途徑。即使它不是一個備受關注的黑客目標,行為不良的客戶端也可能每秒發送數千個請求並使您的服務器崩潰。
安全性不在本文討論範圍之內,但常見的最佳實踐包括:
RESTful API受其實現的限制。響應可能包含比您需要更多的數據,或者需要進一步的請求才能訪問所有數據。
考慮一個提供對作者和書籍數據訪問權限的RESTful API。要顯示十大暢銷書的數據,客戶端可以:
/book/
詳細信息。響應包含帶有每個作者ID的書籍列表。 /author/{id}
請求以獲取每個作者的詳細信息。 這被稱為N 1問題;對於父請求中的每個結果,必鬚髮出N個API請求。
如果這是一個常見的用例,則可以更改RESTful API,以便每個返回的書籍都包含完整的作者詳細信息,例如他們的姓名、年齡、國家/地區、傳記等等。它甚至可以提供其其他書籍的完整詳細信息——儘管這可能會大大增加響應有效負載!
為了避免不必要的大型響應,可以調整API,使作者詳細信息可選——例如,?author_details=full
。 API作者需要處理的選項數量可能會令人眼花繚亂。
REST難題導致Facebook創建了GraphQL——一種Web服務查詢語言。可以將其視為Web服務的SQL:單個請求定義您需要的數據以及您希望如何返回數據。
GraphQL解決了一些由RESTful API帶來的挑戰,儘管它也引入了其他挑戰。例如,緩存GraphQL響應變得很困難。
您的客戶端不太可能遇到與Facebook類似的問題,因此在RESTful API超過其實際限制後,可能值得考慮GraphQL。
所有語言中都有許多工具可以幫助進行RESTful API開發。值得注意的選項包括:
還有許多公共REST API,可用於笑話、貨幣轉換、地理編碼、政府數據以及您可以想到的每個主題。許多是免費的,儘管有些需要您註冊API密鑰或使用其他身份驗證方法。分類列表包括:
在實現您自己的Web服務之前,請嘗試在您自己的項目中使用一些RESTful API。或者,可以效仿Facebook、GitHub、Google和許多其他巨頭,構建您自己的RESTful API。
REST API(具象狀態傳輸應用程序編程接口)是一套規則和約定,允許軟件應用程序使用REST架構風格的原則通過互聯網相互通信和交互。
REST API的主要特徵是什麼? REST API的特點是使用資源、無狀態的客戶端-服務器通信、標準HTTP方法(GET、POST、PUT、DELETE)和統一接口,這些接口通常涉及使用URL訪問和操作資源。
REST API(具象狀態傳輸應用程序編程接口)以其遵循的架構風格命名,稱為REST(具象狀態傳輸)。術語“REST”由Roy Fielding在其2000年的博士論文中提出,他在論文中概述了這種架構風格的原則和約束。 “REST”這個名稱代表了將資源狀態的表示從服務器傳輸到客戶端的概念。
使用REST API的好處是什麼? REST API提供了許多好處,包括簡單性、可擴展性、易於集成、平台獨立性和關注點分離。它們還利用現有的HTTP基礎設施,非常適合Web和移動應用程序。
REST API是否僅限於Web應用程序?不,REST API不限於Web應用程序。它們可用於促進各種類型的軟件應用程序之間的通信,包括Web應用程序、移動應用程序,甚至服務器到服務器的通信。
REST API由四個主要組成部分組成,通常被稱為REST的“四個支柱”。這些組件有助於定義API在REST架構風格中的結構、行為和交互。四個組件是資源、HTTP方法(動詞)、表示和通用接口。
我可以使用哪些工具或庫來構建REST API?有許多工具和框架可用於構建REST API,包括Express.js(Node.js)、Flask(Python)、Ruby on Rails(Ruby)、Django(Python)和Spring Boot(Java)等等。
This response maintains the original image formatting and placement. The text has been rewritten to provide a paraphrased version of the original article while preserving the core meaning and flow.
以上是什麼是REST API?的詳細內容。更多資訊請關注PHP中文網其他相關文章!