首頁 >web前端 >js教程 >什麼是REST API?

什麼是REST API?

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌原創
2025-02-09 12:37:09374瀏覽

What Is a REST API?

REST API詳解:輕鬆理解最常用的網絡服務技術

REST,代表“具象狀態傳輸”(Representational State Transfer),是目前應用最廣泛的網絡服務技術。儘管其名稱略顯抽象,但REST API實質上是兩種計算機系統之間利用網頁瀏覽器和服務器中常見的HTTP技術進行通信的一種方式。

軟件開發中,系統間的數據共享始終是基本需求。例如,購買汽車保險時,保險公司需要獲取您的個人信息和車輛信息,因此需要向車輛登記機構、信用機構、銀行和其他系統請求數據。所有這些都在實時透明地進行,以確定保險公司能否提供具有競爭力的保單。

API(應用程序編程接口)通過提供系統間通信的接口來實現這種系統間的通信。 REST僅僅是一種被廣泛採用的API風格,我們用它以一致且可預測的方式與內部和外部各方進行通信。這可以比作我們過去如何以某種方式發送帶有郵票、地址和信封的信件,以確保其被送達並閱讀。

REST常用於網絡系統中的人員互動,例如在社交媒體應用程序中檢索和更新帳戶信息。

關鍵要點

  1. REST API利用HTTP促進計算機系統之間的通信,使各種服務(如車輛登記機構、信用機構和銀行)能夠實時共享數據,從而提供汽車保險報價等服務。
  2. REST API遵循一套創建網絡服務的建議,包括客戶端-服務器架構、無狀態性、可緩存性和分層系統,使其成為與網絡系統交互的一種簡單而有效的方法。
  3. REST API的實現和使用需要考慮端點一致性、版本控制、身份驗證、安全性以及處理多個請求或不必要的數據等問題,Swagger和Postman等工具支持開發和測試。

REST API示例

在瀏覽器中打開以下鏈接,即可從開放瑣事數據庫請求一個隨機的計算機問題:

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或其他格式之前對其進行解析和使用。

REST API與其他技術

多年來,各種數據通信標準不斷發展。您可能遇到過CORBA、SOAP或XML-RPC等選項。大多數都制定了嚴格的消息規則。

REST由Roy Fielding於2000年定義,比其他技術簡單得多。它不是一個標準,而是一套關於RESTful Web服務的建議和約束。這些包括:

  • 客戶端-服務器:系統A向系統B託管的URL發出HTTP請求,系統B返迴響應。這與瀏覽器的運行方式相同。瀏覽器請求特定URL。請求被路由到Web服務器,Web服務器通常返回HTML頁面。該頁面可能包含對圖像、樣式表和JavaScript的引用,這會導致進一步的請求和響應。
  • 無狀態:REST是無狀態的:客戶端請求應包含響應所需的所有信息。換句話說,應該可以按任意順序發出兩個或多個HTTP請求,並且會收到相同的響應(……除非API被設計為返回隨機響應,如上面的測驗示例)。
  • 可緩存:應將響應定義為可緩存或不可緩存。緩存提高了性能,因為沒有必要為相同的URL重新生成響應。特定用戶在特定時間的私有數據通常不會被緩存。
  • 分層:請求客戶端無需知道它是在與實際服務器、代理還是任何其他中介進行通信。

創建RESTful Web服務

RESTful Web服務請求包含:

  1. 端點URL。實現RESTful API的應用程序將定義一個或多個URL端點,包括域名、端口、路徑和/或查詢字符串——例如,https://mydomain/user/123?format=json

  2. 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請求刪除用戶123
  3. HTTP標頭。身份驗證令牌或cookie等信息可以包含在HTTP請求標頭中。

  4. 主體數據。數據通常以與HTML提交相同的方式通過HTTP主體傳輸,或者通過發送單個JSON編碼的數據字符串來傳輸。

What Is a REST API?

REST API響應

響應有效負載可以是任何實用的內容:數據、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經常互換使用,因此任何一個都會根據需要創建或更新記錄。

REST API“Hello World”示例

以下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>

客戶端REST請求和CORS

考慮在瀏覽器中以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發出兩個請求:

  1. 一個指向同一URL的HTTP OPTIONS請求,用於確定Access-Control-Allow-Origin HTTP響應標頭是否有效
  2. 實際的REST調用

當您的服務器接收到OPTIONS請求方法時,它可以設置Access-Control-Allow-Origin HTTP響應標頭,並返回一個虛擬的空響應,以確保不會重複工作。

REST API挑戰

REST的成功很大程度上歸功於其簡單性。開發人員可以根據自己的喜好實現RESTful API,但這可能會導致進一步的挑戰。有關實施策略的深入了解,請查看我們關於構建RESTful API的13個最佳實踐。

端點一致性

考慮以下端點:

  • /user/123
  • /user/id/123
  • /user/?id=123

所有這些都是獲取用戶123數據的有效選項。當您進行更複雜的運算時,組合的數量會進一步增加。例如,返回十個姓氏以“A”開頭並在companyX工作的用戶,按出生日期倒序排列,從第51條記錄開始。

最終,您如何格式化URL並不重要,但API的一致性非常重要。對於擁有許多開發人員的大型代碼庫來說,這可能是一項挑戰。

REST API版本控制

API更改是不可避免的,但端點URL永遠不應該失效,否則會破壞使用它們的應用程序。

API通常採用版本控制以避免兼容性問題。例如,/2.0/user/123取代/user/123。新的和舊的端點都可以保持活動狀態。不幸的是,這隨後需要維護多個歷史API。舊版本最終可以被丟棄,但此過程需要仔細規劃。

REST API身份驗證

上面顯示的測驗API是開放的:任何系統都可以無需授權即可獲取笑話。對於訪問私有數據或允許更新和刪除請求的API來說,這是不可行的。

與RESTful API位於同一域的客戶端應用程序將發送和接收cookie,就像任何其他HTTP請求一樣。 (請注意,舊版瀏覽器中的Fetch()需要設置credentials初始化選項。)因此,可以驗證API請求以確保用戶已登錄並擁有相應的權限。

第三方應用程序必須使用其他身份驗證方法。常見身份驗證選項包括:

  • HTTP基本身份驗證。在請求標頭中傳遞包含base64編碼的用戶名:密碼字符串的HTTP Authorization標頭。
  • API密鑰。通過發出可能具有特定權限或僅限於特定域的密鑰,授予第三方應用程序使用API的權限。密鑰在HTTP標頭或查詢字符串中的每個請求中都傳遞。
  • OAuth。在發出任何請求之前,必須通過向OAuth服務器發送客戶端ID和可能的客戶端密鑰來獲取令牌。然後,OAuth令牌將與每個API請求一起發送,直到它過期。
  • JSON Web令牌(JWT)。數字簽名的身份驗證令牌安全地傳輸在請求和響應標頭中。 JWT允許服務器對訪問權限進行編碼,因此無需調用數據庫或其他授權系統。

API身份驗證將根據使用環境而有所不同:

  • 在某些情況下,第三方應用程序將被視為具有特定權限的任何其他已登錄用戶。例如,地圖API可以向調用應用程序返回兩點之間的路線。它必須確認應用程序是有效的客戶端,但不需要檢查用戶憑據。
  • 在其他情況下,第三方應用程序正在請求屬於單個用戶的私有數據,例如電子郵件內容。 REST API必須識別用戶及其權限,但它可能並不關心哪個應用程序正在調用API。

REST API安全性

RESTful API提供了訪問和操作應用程序的另一種途徑。即使它不是一個備受關注的黑客目標,行為不良的客戶端也可能每秒發送數千個請求並使您的服務器崩潰。

安全性不在本文討論範圍之內,但常見的最佳實踐包括:

  • 使用HTTPS
  • 使用強大的身份驗證方法
  • 使用CORS將客戶端調用限製到特定域
  • 提供最少的功能——也就是說,不要創建不需要的DELETE選項
  • 驗證所有端點URL和主體數據
  • 避免在客戶端JavaScript中公開API令牌
  • 阻止來自未知域或IP地址的訪問
  • 阻止意外的大型有效負載
  • 考慮速率限制——也就是說,使用相同API令牌或IP地址的請求每分鐘限制為N個
  • 使用適當的HTTP狀態代碼和緩存標頭進行響應
  • 記錄請求並調查故障

多個請求和不必要的數據

RESTful API受其實現的限制。響應可能包含比您需要更多的數據,或者需要進一步的請求才能訪問所有數據。

考慮一個提供對作者和書籍數據訪問權限的RESTful API。要顯示十大暢銷書的數據,客戶端可以:

  • 請求按銷售數量(最暢銷者優先)排序的前10個/book/詳細信息。響應包含帶有每個作者ID的書籍列表。
  • 發出最多10個/author/{id}請求以獲取每個作者的詳細信息。

這被稱為N 1問題;對於父請求中的每個結果,必鬚髮出N個API請求。

如果這是一個常見的用例,則可以更改RESTful API,以便每個返回的書籍都包含完整的作者詳細信息,例如他們的姓名、年齡、國家/地區、傳記等等。它甚至可以提供其其他書籍的完整詳細信息——儘管這可能會大大增加響應有效負載!

為了避免不必要的大型響應,可以調整API,使作者詳細信息可選——例如,?author_details=full。 API作者需要處理的選項數量可能會令人眼花繚亂。

GraphQL能否解決REST API的問題?

REST難題導致Facebook創建了GraphQL——一種Web服務查詢語言。可以將其視為Web服務的SQL:單個請求定義您需要的數據以及您希望如何返回數據。

GraphQL解決了一些由RESTful API帶來的挑戰,儘管它也引入了其他挑戰。例如,緩存GraphQL響應變得很困難。

您的客戶端不太可能遇到與Facebook類似的問題,因此在RESTful API超過其實際限制後,可能值得考慮GraphQL。

REST API鏈接和開發工具

所有語言中都有許多工具可以幫助進行RESTful API開發。值得注意的選項包括:

  • Swagger:各種工具,有助於設計、記錄、模擬、測試和監控REST API
  • Postman:RESTful API測試應用程序
  • Hoppscotch:Postman的開源、基於Web的替代方案

還有許多公共REST API,可用於笑話、貨幣轉換、地理編碼、政府數據以及您可以想到的每個主題。許多是免費的,儘管有些需要您註冊API密鑰或使用其他身份驗證方法。分類列表包括:

  • Any API
  • API list
  • Public APIs
  • Google APIs Explorer

在實現您自己的Web服務之前,請嘗試在您自己的項目中使用一些RESTful API。或者,可以效仿Facebook、GitHub、Google和許多其他巨頭,構建您自己的RESTful API。

關於REST API的常見問題

什麼是REST API?

REST API(具象狀態傳輸應用程序編程接口)是一套規則和約定,允許軟件應用程序使用REST架構風格的原則通過互聯網相互通信和交互。

REST API的主要特徵是什麼? REST API的特點是使用資源、無狀態的客戶端-服務器通信、標準HTTP方法(GET、POST、PUT、DELETE)和統一接口,這些接口通常涉及使用URL訪問和操作資源。

為什麼稱之為REST API?

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的“四個支柱”。這些組件有助於定義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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn