Web 編程入門:什麼是Web API?

語言: CN / TW / HK

theme: devui-blue

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第 12 天,點擊查看活動詳情

前言

在開始構建自己的網絡 API 之前,讓我們先了解網絡的實際是怎樣運行的。 畢竟,Web API 實際上位於萬維網的現有體系結構之上,並且依賴於包括 HTTP,IP / TCP 等在內的多種技術。

在本文中,我們將回顧 Web API 的基本術語:終端,資源,HTTP 動詞,HTTP 狀態碼和 REST 。

萬維網

互聯網是至少從 1960 年代就已經存在的互連計算機網絡系統。 但是,互聯網的早期使用僅限於少數幾個隔離的網絡,這些網絡主要是政府,軍事或科學性質的,可以通過電子方式交換信息。

到 1980 年代,許多研究機構和大學都在使用 Internet 共享數據。 在歐洲,最大的互聯網節點位於瑞士日內瓦的 CERN(歐洲核研究組織),該實驗室經營着世界上最大的粒子物理實驗室。 這些實驗產生大量數據,需要與世界各地的科學家遠程共享。

但是,與今天相比,1980 年代的整體互聯網使用量很小。 大多數人無法使用它,甚至無法理解它為什麼重要。 少數 Internet 節點為所有流量提供動力,而使用它的計算機主要位於同一小型網絡中。

1989年,CERN 的研究科學家蒂姆·伯納斯·李(Tim Berners-Lee)發明了 HTTP 並引入了現代的萬維網,這一切都改變了。 他的遠見卓識是,可以將現有的超文本傳輸系統(其在計算機屏幕上顯示的文本包含指向其他文檔的鏈接(超鏈接))移動到 Internet 上。

他的發明--超文本傳輸協議(HTTP) 是第一個標準的,全球通過 Internet 共享文檔的方式。 它引入了網頁的概念:帶有 URL,鏈接和資源(例如圖像,音頻或視頻等)的分佈式文檔。

如今,當大多數人想到“互聯網”時,他們想到的是萬維網(World Wide Web),這是數十億人和計算機在線通信的主要方式。

URLs

URL(統一資源定位符)是互聯網上資源的地址。 例如,Google主頁位於 http://www.google.com。

當您要轉到 Google 主頁時,請在網絡瀏覽器中鍵入完整的 UR L地址。 然後,您的瀏覽器通過 Internet 發送請求,並與服務器建立了神奇的連接(我們將介紹實際發生的情況),該服務器使用在瀏覽器中呈現 Google 主頁所需的數據進行響應。

請求響應模式是所有 Web 通信的基礎。 客户端(通常是Web瀏覽器,但也有本機應用程序或實際上任何與Internet連接的設備)請求信息,而服務器則以響應進行響應。

由於網絡通信是通過 HTTP 進行的,因此這些形式更正式地稱為 HTTP 請求和 HTTP 響應。

在給定的 URL 中,還有幾個離散的組件。 例如,再次考慮 http://www.google.com。

  • 第一部分,https,指的是使用的 scheme。 它告訴Web瀏覽器如何訪問該位置的資源。 對於網站,通常是 http 或 https,但是也可以是 ftp(用於文件),smtp(用於電子郵件)等等。
  • 下一部分 www.google.com 是網站的主機名或實際名稱。 每個URL都包含一個方案和一個主機。

許多網頁也包含可選路徑

比如訪問 Python 官網 http://www.python.org ,然後單擊“About”頁面的鏈接,您將被重定向到 http://www.python.org/about/

這其中 /about/ 是路徑。總而言之,每個 http://python.org/about/ 之類的 URL 都有三個潛在部分:

  • 模式/協議:https
  • 主機/服務器名:python.org
  • 和(可選)路徑:/about/

互聯網協議傳輸過程

一旦我們知道了資源的實際 URL,其他所有技術的全部集合就必須正常工作(一起)以將客户端與服務器連接並加載實際的網頁。 這被廣泛稱為 Internet procotol 套件,並且整本書都圍繞該主題編寫。 但是,出於我們的目的,我們可以堅持廣泛的基礎知識。

當用户在其網絡瀏覽器中輸入 http://www.google.com 並點擊 Enter 時,會發生一些事情。

  1. 首先,瀏覽器需要在廣闊的互聯網上的某個地方找到所需的服務器。 它使用域名服務(DNS)將域名 google.com 轉換為 IP 地址,該IP地址是代表互聯網上每個已連接設備的唯一數字序列。 使用域名是因為,與“ 172.217.164.68”這樣的IP地址相比,人類更容易記住“ google.com”這樣的域名。

  1. 瀏覽器得到給定域名的 IP 地址後,它需要一種方法來與所需服務器建立一致的連接。 這是通過傳輸控制協議(TCP) 進行的,該協議可在兩個應用程序之間提供可靠,有序和經過錯誤檢查的字節傳輸。
  2. 為了在兩台計算機之間建立 TCP 連接,客户端和服務器之間會發生三次“握手”:

  3. 客户端發送 SYN 給服務端,請求建立連接

  4. 服務端響應一個 SYN-ACK 確認這次請求,傳遞一個連接參數
  5. 客户端發送 ACK 回給服務器以確認連接

一旦建立 TCP 連接,兩台計算機就可以開始通過 HTTP 通信。

HTTP 動詞

每個網頁都包含一個地址(URL)以及一系列被批准的動作,稱為HTTP動詞。 到目前為止,我們主要討論了獲取網頁的問題,但是也可以創建,編輯和刪除內容。

考慮一下微博網站。 登錄後,您可以閲讀時間軸,創建新帖子或編輯/刪除現有帖子。

創建,讀取,更新,刪除這四個動作俗稱 CRUD 功能,它們代表了絕大多數在線採取的動作。

HTTP 協議包含許多從服務器請求信息時可以使用的請求方法。 四個最常見的 CRUD:

  • POST
  • GET
  • PUT
  • DELETE

若要創建內容,請使用 POST,讀取內容 GET,對其進行 Put 操作,然後使用 DELETE 進行刪除。

站點

網站由包含 HTML,CSS,圖像,JavaScript 等的網頁組成。 但是,Web API 具有站點,而站點是帶有公開數據的可用操作(HTTP動詞)列表的 URL(通常為JSON,這是當今最常見的數據格式,並且是Django REST Framework 的默認格式)。

例如,我們可以為一個名為 mysite 的新網站創建以下API端點。

http://www.mysite/api/users # Get returns all users http://www.mysite/api/users/<id> # Get returns a single user

在第一個端點 /api/users 中,可用的 GET 請求返回所有可用用户的列表。 這種返回多個數據資源的端點稱為集合。

第二個端點 /api/users/ 代表一個用户。 GET請求僅返回有關該用户的信息。

如果將 POST 添加到第一個站點,則可以創建一個新用户,而將 DELETE 添加到第二個端點,則可以刪除單個用户。

HTTP

接下來我們將描述 HTTP 的實際含義和工作方式。

HTTP是具有現有 TCP 連接的兩台計算機之間的請求-響應協議。

  • 發出請求的計算機稱為客户端
  • 而響應的計算機稱為服務器。

通常,客户端是 Web 瀏覽器,但也可以是 iOS 應用或任何與互聯網連接的設備。 服務器是經過優化可通過 Internet 工作的任何計算機的名字。

我們需要將一台基本筆記本電腦轉變為一台服務器所需的一切,就是一些特殊的軟件和持久的 Internet 連接。

每個 HTTP 消息均包含一個請求/狀態行,請求頭和可選的正文數據。 例如,這是一個示例 HTTP 消息,瀏覽器可能會發送該 HTTP 消息來請求位於 http://www.google.com 的Google主頁。

GET / HTTP/1.1 Host: google.com Accept_Language: en-US

第一行稱為請求行,它指定要使用的 HTTP 方法(GET),路徑(/)以及要使用的特定HTTP版本(HTTP / 1.1)。

隨後的兩行是 HTTP 協議頭:Host 是域名,

Accept_- Language 是要使用的語言,在這種情況下是美國英語。 有許多 HTTP 標頭可用。

HTTP 消息還有一個可選的第三部分,稱為主體。 但是,我們只會看到帶有 HTTP 響應的正文消息,其中包含數據。

為簡單起見,假設 Google 主頁僅包含 HTML“ Hello,World!” 這就是來自 Google 服務器的 HTTP 響應消息。

``` HTTP/1.1 200 OK Date: Wed, 28 Oct 2019 23:26:07 GMT Server: gws Accept-Ranges: bytes Content-Length: 13 Content-Type: text/html; charset=UTF-8

Hello, world! ```

第一行是響應行,它指定我們正在使用 HTTP / 1.1。 狀態碼 200 OK 指示客户端的請求已成功(稍後會更多關於狀態碼的信息)。

接下來的八行是 HTTP 標頭。 最後,在換行後,我們的實際正文內容為“ Hello,world!”。

因此,每個 HTTP 消息(無論是請求還是響應)都具有以下格式:

``` Response/request line Headers...

(optional) Body ```

大多數網頁包含多個資源,這些資源需要多個 HTTP 請求/響應週期。 如果一個網頁具有 HTML,一個 CSS 文件和一個圖像,則在瀏覽器中呈現完整的網頁之前,需要在客户端和服務器之間來回往返三趟。

狀態碼

一旦您的 Web 瀏覽器在 URL 上執行了 HTTP 請求,就不能保證一切都會真正生效! 因此,有很長的HTTP 狀態代碼列表可用於伴隨每個 HTTP 響應。

您可以根據以下系統判斷狀態碼的一般類型:

  • 2xx 成功:客户請求的操作已收到,理解並接受
  • 3xx 重定向 :所請求的網址已移動
  • 4xx 客户端錯誤:發生錯誤,通常是客户端的URL請求錯誤
  • 5xx 服務端錯誤:服務器無法解決請求

無需記住所有可用的狀態代碼。 通過練習,您將熟悉最常見的設置,例如 200(確定),201(創建),301(永久移動),404(未找到)和 500(服務器錯誤)。

要記住的重要一點是,一般而言,任何給定的 HTTP 請求只有四個潛在結果:它起作用(2xx),它以某種方式重定向(3xx),客户端出錯(4xx)或服務器發出錯誤(5xx)。

這些狀態代碼會自動放置在每條HTTP消息頂部的請求/響應行中。

無狀態

關於 HTTP 的最後一個重要點是,它是一個無狀態協議。 這意味着每個請求/響應對都完全獨立於前一個。 過去的交互沒有存儲的內存,在計算機科學中稱為狀態。

無狀態為 HTTP 帶來了很多好處。 由於所有電子通信系統都會隨着時間流逝而丟失信號,因此,如果我們沒有無狀態協議,那麼如果不經歷一個請求/響應週期,事情就會不斷中斷。 結果,HTTP 被稱為非常有彈性的分佈式協議。

但是缺點是,在 Web 應用程序中,狀態管理非常重要。 説明網站是如何記住您已登錄的,以及電子商務網站如何管理您的購物車。 這是我們使用現代網站的基礎,但 HTTP 本身不支持它。

歷史上狀態是在服務器上維護的,但是在諸如 React,Angular 和 Vue 之類的現代前端框架中,它已越來越多地轉移到客户端,Web 瀏覽器。 當我們介紹用户身份驗證時,我們將詳細瞭解狀態,但是請記住,HTTP 是無狀態的。 這非常有利於在兩台計算機之間可靠地發送信息,但不利於記住每個單獨的請求/響應對之外的任何內容。

REST

代表性狀態轉移(REST)是 Roy Fielding 在其論文中於 2000 年首次提出的體系結構。 它是一種在 Web之上(即在HTTP協議之上)構建API的方法。

關於使 API 實際上是否為 RESTful 的原因,重點關注三個主要特徵。 每個RESTful API:

  • 無狀態,像 HTTP
  • 支持常見的 HTTP 動詞(GET,POST,PUT,DELETE等)
  • 以 JSON 或 XML 格式返回數據

任何 RESTful API 至少必須具有這三個原則。 該標準很重要,因為它提供了設計和使用 Web API 的一致方法。