Web 編程入門:什麼是Web API?
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 時,會發生一些事情。
- 首先,瀏覽器需要在廣闊的互聯網上的某個地方找到所需的服務器。 它使用域名服務(DNS)將域名
google.com
轉換為 IP 地址,該IP地址是代表互聯網上每個已連接設備的唯一數字序列。 使用域名是因為,與“172.217.164.68
”這樣的IP地址相比,人類更容易記住“google.com
”這樣的域名。
- 瀏覽器得到給定域名的 IP 地址後,它需要一種方法來與所需服務器建立一致的連接。 這是通過傳輸控制協議(TCP) 進行的,該協議可在兩個應用程序之間提供可靠,有序和經過錯誤檢查的字節傳輸。
-
為了在兩台計算機之間建立 TCP 連接,客户端和服務器之間會發生三次“握手”:
-
客户端發送 SYN 給服務端,請求建立連接
- 服務端響應一個 SYN-ACK 確認這次請求,傳遞一個連接參數
- 客户端發送 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 的一致方法。
- 一文帶你瞭解 Python 中的繼承知識點
- 如何使用 HTML 和 CSS 寫一個登錄界面
- 代碼之外:寫作是倒逼成長的最佳方式
- Redis 的快速介紹及其基本數據類型和操作
- 經久不衰的設計定律就是——不要讓我思考的設計
- 一文了解 Python 中的裝飾器
- 聊聊 Go 語言與雲原生技術
- Go Web 編程入門:驗證器
- Golang 的藝術、哲學和科學
- Django API 開發:視圖設置和路由
- Web 編程入門:什麼是Web API?
- Python 實現設計模式之工廠模式
- 好開心我進入了面試環節,那麼我該如何自我介紹?
- 鴻蒙學習筆記:利用鴻蒙JavaUI 框架的 WebView 加載在線網頁
- Go 語言入門很簡單:讀寫鎖