国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
關鍵要點
REST API示例
REST API與其他技術
創(chuàng)建RESTful Web服務
REST API響應
REST API“Hello World”示例
客戶端REST請求和CORS
REST API挑戰(zhàn)
端點一致性
REST API版本控制
REST API身份驗證
REST API安全性
多個請求和不必要的數據
GraphQL能否解決REST API的問題?
REST API鏈接和開發(fā)工具
關於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,代表“具象狀態(tài)傳輸”(Representational State Transfer),是目前應用最廣泛的網絡服務技術。儘管其名稱略顯抽象,但REST API實質上是兩種計算機系統(tǒng)之間利用網頁瀏覽器和服務器中常見的HTTP技術進行通信的一種方式。

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

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

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

關鍵要點

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

REST API示例

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

http://miracleart.cn/link/bf13848f7f02f488b2e12e009a8b0df3

這是一個作為RESTful Web服務實現(xiàn)的公共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 "http://miracleart.cn/link/bf13848f7f02f488b2e12e009a8b0df3"</code>

所有流行的語言和運行時環(huán)境中都提供HTTP客戶端庫,包括JavaScript、Node.js和Deno中的Fetch以及PHP中的file_get_contents()。 JSON響應是機器可讀的,因此可以在輸出HTML或其他格式之前對其進行解析和使用。

REST API與其他技術

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

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

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

創(chuàng)建RESTful Web服務

RESTful Web服務請求包含:

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

  2. HTTP方法。任何端點都可以使用不同的HTTP方法,這些方法對應於應用程序的創(chuàng)建、讀取、更新和刪除(CRUD)操作:

    HTTP方法 CRUD 操作 GET 讀取 返回請求的數據 POST 創(chuàng)建 創(chuàng)建一個新記錄 PUT或PATCH 更新 更新現(xiàn)有記錄 DELETE 刪除 刪除現(xiàn)有記錄

    示例:

    • /user/的GET請求返回系統(tǒng)上註冊用戶的列表
    • /user/的POST請求使用主體數據創(chuàng)建ID為123的用戶(見下面的4.)。響應返回ID。
    • /user/123的PUT請求使用主體數據更新用戶123(見下面的4.)
    • /user/123的GET請求返回用戶123的詳細信息
    • /user/123的DELETE請求刪除用戶123
  3. HTTP標頭。身份驗證令牌或cookie等信息可以包含在HTTP請求標頭中。

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

What Is a REST API?

REST API響應

響應有效負載可以是任何實用的內容:數據、HTML、圖像、音頻文件等等。數據響應通常是JSON編碼的,但也可以使用XML、CSV、簡單的字符串或任何其他格式。您可以允許在請求中指定返回格式——例如,/user/123?format=json/user/123?format=xml。

還應在響應標頭中設置適當的HTTP狀態(tài)代碼。 200 OK用於成功的請求,儘管在創(chuàng)建記錄時也可以返回201 Created。錯誤應返回適當的代碼,例如400 Bad Request、404 Not Found、401 Unauthorized等等。

可以設置其他HTTP標頭,包括Cache-Control或Expires指令,以指定在響應被認為是“陳舊”之前可以緩存多長時間。

但是,沒有嚴格的規(guī)則。端點URL、HTTP方法、主體數據和響應類型可以根據您的喜好進行實現(xiàn)。例如,POST、PUT和PATCH經常互換使用,因此任何一個都會根據需要創(chuàng)建或更新記錄。

REST API“Hello World”示例

以下Node.js代碼使用Express框架創(chuàng)建一個RESTful Web服務。單個/hello/端點響應HTTP GET請求。

確保已安裝Node.js,然後創(chuàng)建一個名為restapi的新文件夾。在此文件夾中創(chuàng)建一個新的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以獲取依賴項,然後創(chuàng)建一個包含以下代碼的index.js文件:

<code>curl "http://miracleart.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調用執(zhí)行相同的API請求,瀏覽器控制臺將顯示Object { message: "Hello world!" },正如您預期的那樣。

但是,假設您的RESTful Web服務現(xiàn)在在Web上的http://mydomain.com/hello/域名上上線了。頁面JavaScript fetch() URL相應地更改,但是現(xiàn)在在瀏覽器中打開http://localhost:8888/會返回控制臺錯誤Cross-Origin Request Blocked

出於安全原因,瀏覽器只允許客戶端XMLHttpRequest和Fetch API調用與調用頁面託管在同一域。

幸運的是,跨源資源共享(CORS)允許我們規(guī)避該安全限制。設置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 "http://miracleart.cn/link/bf13848f7f02f488b2e12e009a8b0df3"</code>

請注意,瀏覽器會向REST API發(fā)出兩個請求:

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

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

REST API挑戰(zhàn)

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

端點一致性

考慮以下端點:

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

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

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

REST API版本控制

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

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

REST API身份驗證

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

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

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

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

API身份驗證將根據使用環(huán)境而有所不同:

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

REST API安全性

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

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

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

多個請求和不必要的數據

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

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

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

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

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

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

GraphQL能否解決REST API的問題?

REST難題導致Facebook創(chuàng)建了GraphQL——一種Web服務查詢語言??梢詫⑵湟暈閃eb服務的SQL:單個請求定義您需要的數據以及您希望如何返回數據。

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

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

REST API鏈接和開發(fā)工具

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

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

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

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

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

關於REST API的常見問題

什麼是REST API?

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

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

為什麼稱之為REST API?

REST API(具象狀態(tài)傳輸應用程序編程接口)以其遵循的架構風格命名,稱為REST(具象狀態(tài)傳輸)。術語“REST”由Roy Fielding在其2000年的博士論文中提出,他在論文中概述了這種架構風格的原則和約束。 “REST”這個名稱代表了將資源狀態(tài)的表示從服務器傳輸到客戶端的概念。

使用REST API的好處是什麼? REST API提供了許多好處,包括簡單性、可擴展性、易於集成、平臺獨立性和關注點分離。它們還利用現(xiàn)有的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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

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整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語言,各自適用於不同的應用場景。 Java用於大型企業(yè)和移動應用開發(fā),而JavaScript主要用於網頁開發(fā)。

JavaScript評論:簡短說明 JavaScript評論:簡短說明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時間合作? 如何在JS中與日期和時間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時間處理需注意以下幾點:1.創(chuàng)建Date對像有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設置時間信息可用get和set方法,注意月份從0開始;3.手動格式化日期需拼接字符串,也可使用第三方庫;4.處理時區(qū)問題建議使用支持時區(qū)的庫,如Luxon。掌握這些要點能有效避免常見錯誤。

為什麼要將標籤放在的底部? 為什麼要將標籤放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

JavaScript:探索用於高效編碼的數據類型 JavaScript:探索用於高效編碼的數據類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

什麼是在DOM中冒泡和捕獲的事件? 什麼是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個階段,捕獲是從頂層向下到目標元素,冒泡是從目標元素向上傳播到頂層。 1.事件捕獲通過addEventListener的useCapture參數設為true實現(xiàn);2.事件冒泡是默認行為,useCapture設為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委託,提高動態(tài)內容處理效率;5.捕獲可用於提前攔截事件,如日誌記錄或錯誤處理。了解這兩個階段有助於精確控制JavaScript響應用戶操作的時機和方式。

Java和JavaScript有什麼區(qū)別? Java和JavaScript有什麼區(qū)別? Jun 17, 2025 am 09:17 AM

Java和JavaScript是不同的編程語言。 1.Java是靜態(tài)類型、編譯型語言,適用於企業(yè)應用和大型系統(tǒng)。 2.JavaScript是動態(tài)類型、解釋型語言,主要用於網頁交互和前端開發(fā)。

See all articles