目錄
關鍵要點
REST API示例
REST API與其他技術
創建RESTful Web服務
REST API響應
REST API“Hello World”示例
客戶端REST請求和CORS
REST API挑戰
端點一致性
REST API版本控制
REST API身份驗證
REST API安全性
多個請求和不必要的數據
GraphQL能否解決REST API的問題?
REST API鏈接和開發工具
關於REST API的常見問題
什麼是REST API?
為什麼稱之為REST API?
REST API的四個組成部分是什麼?
首頁 web前端 js教程 什麼是REST API?

什麼是REST API?

Feb 09, 2025 pm 12:37 PM

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/返回:

// 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}`);
);
登入後複製

客戶端REST請求和CORS

考慮在瀏覽器中以URL http://localhost:8888/啟動的以下HTML頁面:

{
  "message": "Hello world!"
}
登入後複製

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

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整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

JavaScript難以學習嗎? JavaScript難以學習嗎? Apr 03, 2025 am 12:20 AM

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

console.log輸出結果差異:兩次調用為何不同? console.log輸出結果差異:兩次調用為何不同? Apr 04, 2025 pm 05:12 PM

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...

See all articles