"objects": [
{ "id": 1, "item": "Lise with a Parasol", "artist": "Pierre Auguste Renoir", "collection":"Museum Folkwang, Essen, Germany", "date":"1867"},
{ "id": 2, "item": "The Theatre Box", "artist": "Pierre Auguste Renoir", "collection":"Courtauld Gallery, London, England", "date":"1874"},
{ "id": 3, "item": "Dance in the City", "artist": "Pierre Auguste Renoir", "collection":"Musée d'Orsay, Paris, France", "date":"1883"},
{ "id": 4, "item": "Dance at Bougival", "artist": "Pierre Auguste Renoir", "collection":"Musée d'Orsay, Paris, France", "date":"1883"}
]
}

這個 JSON 文件是數(shù)據(jù)庫的模擬版本。 可以使用 json-server 來查詢此數(shù)據(jù)。

查詢數(shù)據(jù)庫

在終端中,轉(zhuǎn)到添加了 db.json 的位置,然后輸入 json-server --watch db.json。 服務(wù)器將在端口 3000 上運行。 可以通過特殊格式的 URL 查詢它。

嘗試在瀏覽器的 URL 框中輸入 http://localhost:3000/objects。 你將看到數(shù)據(jù)庫中所有對象,以純 JSON 格式列出。

嘗試使用 URL 查詢此數(shù)據(jù)集:http://localhost:3000/objects/1 將顯示 ID 為 1 的項目。

了解 REST API 調(diào)用

你可能已經(jīng)注意到,API 調(diào)用由幾部分組成。 REST API 調(diào)用的四個主要部分是終結(jié)點、方法、標頭和數(shù)據(jù)(或主體)。

終結(jié)點是數(shù)據(jù)往返于網(wǎng)頁的路由。 它采用 URL 的形式,就像你之前用來查詢數(shù)據(jù)集的 URL 一樣。

方法是查詢被設(shè)計用來執(zhí)行的基于 HTTP 的操作。 它可以采用 GET、POST、DELETE 或其他關(guān)鍵字的形式。 GET 方法通過終結(jié)點獲取數(shù)據(jù)。 POST 方法通過終結(jié)點將數(shù)據(jù)從網(wǎng)頁傳遞到服務(wù)器。 DELETE 方法從服務(wù)器中刪除資源。

標頭指定完成方法指定的操作類型所需的授權(quán)和身份驗證。 它們可能包括有助于對用戶授權(quán)的 API 密鑰。

數(shù)據(jù)包括 API 發(fā)送到服務(wù)器的對象。 它通常采用 JSON 格式。

也可以按項名稱進行搜索:http://localhost:3000/objects?item=Lise%20with%20a%20Parasol

這種查詢演示了以下兩點:

使用瀏覽器的開發(fā)人員工具查看網(wǎng)頁如何發(fā)送和接收數(shù)據(jù)。 可以通過右鍵單擊網(wǎng)頁并選擇“檢查”或選擇“F12”來找到它們。 這些工具可用于 Web 開發(fā)的所有領(lǐng)域。 但是,當(dāng)你使用 REST API 調(diào)用時,可以深入到“網(wǎng)絡(luò)”選項卡以觀察你構(gòu)建的 API 的行為方式。 如果刷新瀏覽器,可以看到你在后臺使用 GET 檢索要在瀏覽器中顯示的數(shù)據(jù)。

在我們的調(diào)用中,你通過 URL http://localhost:3000/objects 調(diào)用了一個終結(jié)點。

使用的方法是 GET。

目前調(diào)用中不需要任何標頭。 (稍后將詳細了解標頭。)

返回的數(shù)據(jù)與存儲在 db.json 文件中的數(shù)據(jù)相同(由查詢篩選)。

身份驗證策略

大都會博物館的 API 對公眾開放,不需要身份驗證。 唯一的要求是用戶“將請求速率限制為每秒 80 個請求”。這種開放程度對于 API 來說有點罕見。 通常,管理面向公眾的 API 的組織要求某種訪問身份驗證,以防止不必要的終結(jié)點過度使用。

如果 API 要求進行身份驗證,則你不能通過 URL 調(diào)用直接調(diào)用以獲取數(shù)據(jù)。 需要改用“請求標頭”,它是隨請求一起發(fā)送的對象,并且使用 HTTP 調(diào)用。

使用 HTTP 協(xié)議進行身份驗證

HTTP 協(xié)議為開發(fā)人員提供若干身份驗證策略,包括“基本身份驗證”和“持有者身份驗證”。 “基本身份驗證”本質(zhì)上是不安全的,因為它要求直接通過請求標頭傳遞用戶名和密碼。 下面是一個示例:

Authorization: Basic abcdef12345==

“持有者身份驗證”更常見。 “持有者身份驗證”需要在身份驗證調(diào)用之前獲取的令牌,該令牌必須在請求標頭中傳遞:

Authorization: Bearer <my-token>

使用 API 密鑰進行身份驗證

API 密鑰在 API 體系結(jié)構(gòu)中很常見。 它們可能在各種位置出現(xiàn):通過正文數(shù)據(jù)作為 JSON 傳遞,通過查詢字符串發(fā)送或通過自定義標頭或授權(quán)標頭發(fā)送。

密鑰是在代碼和 API 之間形成握手的一種簡便方法,但是它們本質(zhì)上是不安全的。 從理論上講,任何人都可以使用密鑰,只要他們可以通過網(wǎng)絡(luò)調(diào)用攔截密鑰。

提示

最好將 API 密鑰存儲在云中并通過調(diào)用環(huán)境變量的函數(shù)來訪問它們。 但是該方法超出了本教程的范圍!

OAuth

使用 API 密鑰很容易變得復(fù)雜,但這是為使用 API 進行身份驗證的最常用方法。 進行身份驗證并使用 API 的另一種方法是通過 OAuth。 OAuth(尤其是版本 2)提供更精細的身份驗證策略。 用戶被定向到 API 的站點,然后完成 OAuth 為啟用訪問所允許的許多流之一。 可能存在多種情況。 但是 OAuth 基本上支持 API 密鑰的創(chuàng)建,并使用密鑰對令牌進行身份驗證,從而支持對有限的操作進行有限的 API 訪問。 這樣,用戶可以在 Web 調(diào)用中使用訪問令牌,確保針對特定用途和特定時間段訪問 API 的各個部分。

API 密鑰與訪問令牌的不同之處在于,密鑰提供授權(quán)但不提供身份驗證。 訪問令牌提供一種更安全的方法來訪問敏感終結(jié)點。

在下一個單元中,你將查詢使用 OAuth 2 的 API:史密森尼博物館的庫珀·休伊特國家設(shè)計博物館

查詢大都市API

到目前為止,你已構(gòu)建可以在本地計算機上使用的 API,以便更好地了解 API 的工作方式。 現(xiàn)在,你將查詢第一個 API,以在真正的第三方 API 中搜索對象:紐約大都會博物館 API。

現(xiàn)代博物館藏品管理的一個奇妙之處在于,目前正在進行的藏品數(shù)字化和在線化工作也使業(yè)余藝術(shù)愛好者可以訪問其數(shù)據(jù)。 美國的史密森尼博物館、阿姆斯特丹的國立博物館和美國的芝加哥藝術(shù)學(xué)院等許多博物館都在開放它們的藏品,讓公眾可以通過虛擬方式接觸它們。

研究 API

研究第三方 API 的使用的第一步是查看其文檔。 查看博物館提供的 API 文檔。

要考慮的另一件事是權(quán)限。 通讀要使用的所有第三方 API 的使用條款,以確保要執(zhí)行的操作是可以接受的。 大都會博物館的條款和條件頁面是一個不錯的開始。 因為該博物館采用了知識共享零許可證,所以數(shù)據(jù)集沒有版權(quán)。 該許可證使臨時用戶可以更輕松地使用 API。

你不需要 API 密鑰即可使用此 API,因此可以通過格式標準的 URL 查詢使用 GET 請求來訪問其集合的許多元素。 通過訪問給定的 URL,可以在瀏覽器中使用大都會博物館的 API。 這是使用 API 的最簡單方法。 在后面的單元中,你將了解如何使用代碼調(diào)用 API。

查詢 API

大都會博物館的終結(jié)點或用于查詢對象的 URL 是多個對象、單個對象、部門和搜索。

此 API 的設(shè)計表明,用戶應(yīng)該搜索集合,然后深入到對象組和各個對象以獲取更多細節(jié)和信息。 API 正在逐步構(gòu)建。 選擇包含部門終結(jié)點可能表明數(shù)據(jù)的構(gòu)造方式以及用戶搜索數(shù)據(jù)的方式。

假設(shè)你對武器和盔甲感興趣。 可以查詢部門終結(jié)點以獲取該部門的 ID:

https://collectionapi.metmuseum.org/public/collection/v1/departments

如果將該鏈接粘貼到瀏覽器中,會發(fā)現(xiàn)武器和盔甲部門的部門 ID 為 4。 現(xiàn)在,你已獲得了一些信息,可以用來在集合中找到有趣的項目。 為此,可以使用“搜索”終結(jié)點。

由于該 API 嘗試返回可控制的數(shù)據(jù)量,鑒于 5,000 年藝術(shù)史涉及大量藏品,因此僅按照 DepartmentId 進行搜索不會成功。 你需要通過該部門內(nèi)的關(guān)鍵字來縮小搜索范圍。

這種縮小范圍活動要求你在 URL 中使用查詢參數(shù)來訪問終結(jié)點。 如果查看文檔,你會看到預(yù)期的格式是向終結(jié)點追加 ?q=keyword(s)。 所以,如果只查找銀制浮雕武器和盔甲物品,請將此字符串粘貼到瀏覽器:https://collectionapi.metmuseum.org/public/collection/v1/search?departmentId=4&q=embossed%20silver。 返回了二十七個項目。

此查詢提供用于檢索返回的對象的信息。 若要查看組中的第一個對象,請轉(zhuǎn)到以下終結(jié)點:https://collectionapi.metmuseum.org/public/collection/v1/objects/626019。 返回的數(shù)據(jù)顯示 1800 年以來壯觀的盔甲裝束(配有制型紙頭盔)。 可以想象戰(zhàn)時一方穿上它的樣子!

這個服裝頭盔于 1988 年被大都會博物館收購,目前存放在武器和盔甲館。

總結(jié)

大都會博物館的 API 有條理且易于訪問,可以作為你構(gòu)想如何在網(wǎng)站中使用 API 的一個好起點。 可以使用 search 終結(jié)點和查詢參數(shù)構(gòu)建搜索。 可以在 department 中查詢一組 objectid,并在其上循環(huán)以創(chuàng)建一個有趣對象的列表。 可以深入而詳細地瀏覽該集合,而無需接觸甚至理解其基礎(chǔ)數(shù)據(jù)庫。 這就是出色的 API 的強大之處!

查詢Cooper Hewitt API

現(xiàn)在,你已經(jīng)在大都會博物館發(fā)現(xiàn)了一些有趣的藏品,下面讓我們看一下另一個博物館 API:Cooper Hewitt API。 庫珀·休伊特國家設(shè)計博物館是史密森尼博物館的一部分。 它是美國的國家設(shè)計博物館。 從戴森風(fēng)扇到古董鞋,它的藏品側(cè)重于有趣的著名設(shè)計。

若要訪問 API,你需要一個訪問令牌,或者同時需要一個訪問令牌和一個充當(dāng)其驗證器的 API 密鑰。 該 API 允許用戶使用一次性訪問令牌訪問終結(jié)點以進行單獨訪問。 但是如果要使用代碼查詢 API,需要兩個元素。

創(chuàng)建令牌和密鑰

請轉(zhuǎn)到 API 主頁并創(chuàng)建帳戶。 創(chuàng)建帳戶后,可以自行創(chuàng)建密鑰和訪問令牌。 將文本文件中生成的令牌保存在本地計算機上的安全位置。

備注

為什么要同時創(chuàng)建訪問令牌和密鑰? 該 API 使用 OAuth 2,OAuth 2 需要令牌來監(jiān)視和限制對該 API 的訪問。 API 密鑰與訪問令牌一起使用,以確保你有權(quán)以通過令牌設(shè)置的方式訪問 API。

創(chuàng)建令牌并使用 API 密鑰對其進行身份驗證之后,可以開始在測試 API 調(diào)用的 URL 中發(fā)送令牌。 讓我們看看在庫珀·休伊特設(shè)計博物館中可以找到什么!

查詢 API

假設(shè)你對新藝術(shù)風(fēng)格感興趣,并且想看看那個時代的藏品中存在哪些對象。 通過該 API,可以獲取該時代的 ID,并對其進行查詢以獲取針對該時代指定的藏品的 URL。

備注

對于以下查詢,獲取如前所述的訪問令牌,并將其粘貼到查詢中的指定位置。

若要查找新藝術(shù)風(fēng)格的對象,請按以下方式查詢 API:https://api.collection.cooperhewitt.org/rest/?method=cooperhewitt.periods.getList&access_token=<your-token>&page=1&per_page=100。 該查詢指定需要追加要檢索的頁面以及每頁返回的元素數(shù)。

查詢 API 時,響應(yīng)中將返回一個 URL,其中包含可供精讀的新藝術(shù)風(fēng)格對象列表(包括一些著名的 Mucha 海報):https://collection.cooperhewitt.org/periods/35417231/。 可以看一看。 通過查詢此 API,還能發(fā)現(xiàn)其他哪些時代?

處理響應(yīng)

在許多情況下,了解 RESTful API 發(fā)送回的狀態(tài)代碼很重要。 如果出現(xiàn)服務(wù)器錯誤,該怎么辦? 如果沒有要發(fā)送回的數(shù)據(jù),該怎么辦? 如果出現(xiàn)身份驗證錯誤,該怎么辦? 如果發(fā)生上述任何一種情況,關(guān)注代碼都是很有用的,這樣就可以告訴前端用戶存在問題。

嘗試查詢

例如,在瀏覽器中嘗試以下查詢:https://api.collection.cooperhewitt.org/rest/?method=cooperhewitt.periods.getList&access_token=xxxxx&page=1&per_page=100。

API 將返回代碼 400:這是一個“錯誤請求”錯誤。 這是 URL 中的訪問令牌無效導(dǎo)致的。

了解狀態(tài)代碼

可能遇到的常見訪問代碼包括:

請務(wù)必了解狀態(tài)代碼,以便可以在客戶端代碼中很好地處理這些代碼。 通常,200 代碼表示“一切正?!?,可以繼續(xù)顯示查詢結(jié)果。 該代碼也可用于對錯誤進行分類并顯示處理錯誤的適當(dāng)消息。

使用庫

通過瀏覽器的 URL 發(fā)送查詢來測試 API(將訪問令牌填充的查詢字符串作為補充)是有用的。 但是在生產(chǎn)應(yīng)用中,可能需要進行更復(fù)雜的 API 調(diào)用,將各種數(shù)據(jù)組合在一起形成查詢。

因此,許多開發(fā)人員依賴標準化 API 使用過程的庫。 對于 JavaScript 開發(fā)人員來說,Axios 是一個絕佳的選擇。 Python 程序員可能會使用請求。 使用 PowerShell? 嘗試 RestMethod。

使用 URL 進行查詢

假設(shè)你對收音機鬧鐘非常熱衷,并且對庫珀·休伊特博物館中設(shè)計精良的示例藏品很感興趣。 你可以查看該博物館的 API 文檔。 你會看到,如果想要分頁結(jié)果并且結(jié)果中僅包含圖像,可以使用這種格式的 API 訪問令牌來構(gòu)建查詢:

https://api.collection.cooperhewitt.org/rest/?method=cooperhewitt.search.collection&access_token=<your access token>&query=clock%20radio&has_images=true&page=1&per_page=100

出現(xiàn)的第一個示例是 20 世紀 50 年代的以下精巧示例:

通過在本地開發(fā)環(huán)境中運行以下代碼片段,嘗試使用庫來調(diào)用 Cooper Hewitt API:

var axios = require('axios');

var config = {
method: 'get',
url: 'https://api.collection.cooperhewitt.org/rest/?method=cooperhewitt.search.objects&query=clock%20radio&page=1&per_page=100&access_token=yourtoken',
headers: { }
};

axios(config)
.then(function (response) {
console.log(JSON.stringify(response.data));
})
.catch(function (error) {
console.log(error);
});

通過使用適合你首選編程語言的庫,可以在基于用戶交互(例如按鈕單擊)編寫函數(shù)腳本時,更好地控制如何在代碼中使用 API。

使用方法寫入終結(jié)點

類似于這些博物館示例的許多第三方終結(jié)點不允許使用 POST 寫入其數(shù)據(jù)庫。 這些數(shù)據(jù)庫不是事務(wù)性的。 但是你可以練習(xí)使用方法來寫入自己的數(shù)據(jù)。

返回到你之前在本模塊中創(chuàng)建的 db.json 文件。 可以將數(shù)據(jù)寫入此數(shù)據(jù)庫。

使用終端,cddb.json 文件的位置,然后輸入 json-server --watch db.json。 服務(wù)器將在端口 3000 上啟動。 可以將 GET 用于對象集合 localhost:3000/objects,使用 Postman 對其進行查詢。

可以通過設(shè)置標頭值 'content-type': 'application/json' 并通過字符串化的 JSON 對象來寫入此集合:

var axios = require('axios');
var data = JSON.stringify({"id":5,"item":"The Fiancés","artist":"Pierre Auguste Renoir","collection":"Wallraf–Richartz Museum, Cologne, Germany","date":"1868"});

var config = {
method: 'post',
url: 'localhost:3000/objects',
headers: {
'content-type': 'application/json'
},
data : data
};

axios(config)
.then(function (response) {
console.log(JSON.stringify(response.data));
})
.catch(function (error) {
console.log(error);
});

可以使用個人數(shù)據(jù)庫和 API 終結(jié)點嘗試其他操作。 嘗試使用你選擇的庫從集合中獲取 (GET)、發(fā)布 (POST) 甚至刪除 (DELETE) 項目。

知識檢查

通過FAQ方式讓你對API的訪問以及用途有更加深刻的理解

Q: 是否所有API都需要密鑰才能訪問?
A: 不是所有API都需要密鑰。大多數(shù)API確實需要密鑰來訪問,以確保安全性和限制訪問量。然而,有些API是開放的,允許用戶無需密鑰直接訪問。

Q: OAuth如何使用訪問令牌來確保安全性和用戶登錄?
A: OAuth使用訪問令牌來完成以下任務(wù):

Q: API有哪些主要用途?
A: API有多種用途,包括:

總結(jié)

在本模塊中,你已了解什么是 API,以及如何構(gòu)建你自己的 API 并從中檢索數(shù)據(jù)。 還了解了如何通過博物館 API 發(fā)現(xiàn)博物館藏品。 你了解了完全開放的 API 和需要訪問令牌的 API。 最后,你了解了可幫助你訪問和使用 API 的各種庫。

原文鏈接:https://learn.microsoft.com/zh-cn/training/modules/use-apis-discover-museum-art/

上一篇:

REST API 設(shè)計:過濾、排序和分頁

下一篇:

為什么要將你的存量API進行分類?
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費