REST 是現(xiàn)代領(lǐng)域 Web API 的一個(gè)極其強(qiáng)大的解決方案。它提供了廣泛的優(yōu)勢(shì),可以幫助任何服務(wù)變得更高效、更快迭代、更穩(wěn)定。

Python 是一種強(qiáng)大的高級(jí)語言,可以在廣泛的系統(tǒng)和設(shè)備類別中解鎖高級(jí)功能。它是人類可讀的、高效的并且被廣泛采用。

這兩種技術(shù)結(jié)合起來,可以在 API 領(lǐng)域提供令人難以置信的產(chǎn)品。在本指南中,我們將討論什么是 REST、如何打造真正的 RESTful 以及 Python 如何支持這項(xiàng)工作。我們將研究一些最佳實(shí)踐。

什么是REST?

REST(即表述性狀態(tài)傳輸)是系統(tǒng)通信的范例。這一概念是讓系統(tǒng)通過一種無狀態(tài)模式相互通信,這種模式利用資源狀態(tài)的表示而不是資源本身。本質(zhì)上,每次交互都是利用資源請(qǐng)求者和資源持有者之間的特定關(guān)系進(jìn)行有狀態(tài)表示,這允許跨各種用例進(jìn)行無縫交互。

?REST基礎(chǔ)知識(shí)

REST 作為一個(gè)概念首次在Roy Fielding 的一篇現(xiàn)已著名的論文中被分享。在這篇論文中,菲爾丁定義了一種基于表征狀態(tài)轉(zhuǎn)移的新通信方式。雖然在實(shí)踐中有多種可選屬性可以使某些東西變得“RESTful”,但 REST 的核心本質(zhì)最好定義如下:

 什么是Python?

充分了解 REST 后,我們來看看 Python。 Python 是一種編程語言,于 1991 年首次發(fā)布,作為 ABC 的后繼語言。該語言的目的是人類可讀且高效,重點(diǎn)是垃圾收集、動(dòng)態(tài)類型和多范式支持。它將各種庫打包在一起,以實(shí)現(xiàn)大量的功能和用途,因此,它是 Web API 的一個(gè)非常受歡迎的選擇。

Python 很受歡迎,因?yàn)樗苋菀咨鲜?。它使用?jiǎn)單的語法,具有很高的可讀性,利用正常的人類語音和空格使事情變得更清晰、更容易理解。它將許多復(fù)雜的底層功能抽象為簡(jiǎn)單的結(jié)構(gòu),使您能夠以低摩擦快速上手。

值得注意的是,Python 在各種系統(tǒng)和環(huán)境中具有高度的跨平臺(tái)支持。該社區(qū)異常強(qiáng)大,這意味著在那些沒有本機(jī) Python 支持的環(huán)境中,可能存在允許此功能和集成的社區(qū)擴(kuò)展或系統(tǒng)。

如何使用 Python 創(chuàng)建 RESTful API

出于本文的目的,我們將使用 Python 和 Flask。有多種優(yōu)秀的 Python API 開發(fā)工具,但我們使用 Flask,因?yàn)樗恍枰魏喂ぞ呋驇旒纯砷_始構(gòu)建 Web API。 Flask 確實(shí)有擴(kuò)展來添加額外的功能,但對(duì)于這個(gè) API,我們將直接使用開箱即用的工具集。

設(shè)置您的開發(fā)環(huán)境

首先,本教程假設(shè)您已經(jīng)安裝了 Python。如果不這樣做,請(qǐng)導(dǎo)航到 Python 網(wǎng)頁并通過適合您的環(huán)境“可緩存”的方法進(jìn)行安裝

 安裝燒瓶

安裝Python后,必須先安裝Flask。為此,請(qǐng)發(fā)出以下命令:

pip install flask

這將從 Python 包索引安裝 Flask。

 創(chuàng)造環(huán)境

接下來,您需要為 Python API 創(chuàng)建一個(gè)目錄。我們將此目錄稱為“Moesif_tutorial:

mkdir moesif_tutorial && cd moesif_tutorial

此代碼將創(chuàng)建目錄 (mkdir) 并將工作目錄 (cd) 更改為新創(chuàng)建的位置。從這里,您需要?jiǎng)?chuàng)建新的項(xiàng)目文件。我們將其稱為“tutorial_app”。

touch tutorial_app.py

通過“觸摸”該文件,我們正在創(chuàng)建構(gòu)建文件并準(zhǔn)備好保存我們的項(xiàng)目。 “touch”將創(chuàng)建該文件,但我們需要啟動(dòng)一個(gè)虛擬環(huán)境來處理它。為此,請(qǐng)使用以下命令:

python3 -m venv <venv>/bin/activate

此命令將取決于您的環(huán)境目錄 – 有關(guān)如何正確啟動(dòng)此目錄的更多信息,請(qǐng)參閱Python 文檔。

 創(chuàng)建 API 骨架

創(chuàng)建環(huán)境后,我們將制作 API。這個(gè) API 非常簡(jiǎn)單 – 它將包含有關(guān)三個(gè) Python 框架的詳細(xì)信息,并允許用戶檢索有關(guān)這些框架的信息。

要開始構(gòu)建 API,我們將直接編輯tutorial_app.py。在該文件中,添加以下代碼:

from flask import Flask
app = Flask(__name__)

它的作用是實(shí)例化 Flask 類,實(shí)際上是“創(chuàng)建”應(yīng)用程序。有了這個(gè),我們接下來創(chuàng)建了一個(gè)具有名稱值的類實(shí)例,我們將在其中將 Flask 指向各種文件和元素。

這是 Python 應(yīng)用程序的最基本版本 – 但為了使其成為 RESTful 版本,我們需要查詢端點(diǎn),在我們的例子中,這意味著我們需要一些數(shù)據(jù)供其引用。由于我們沒有連接數(shù)據(jù)庫,因此我們可以直接將此數(shù)據(jù)存儲(chǔ)為數(shù)據(jù)存儲(chǔ)。在Python中,數(shù)據(jù)存儲(chǔ)是我們可以存儲(chǔ)在應(yīng)用程序本身中的一段任意代碼,這使我們能夠在沒有數(shù)據(jù)庫或外部數(shù)據(jù)存儲(chǔ)解決方案的情況下托管數(shù)據(jù)。

為此,我們可以將數(shù)據(jù)存儲(chǔ)附加到我們的文件中:

from flask import Flask
app = Flask(__name__)

in_memory_datastore = {
"Flask" : {"name": "Flask", "created": 2010, "parent": "Python"},
"Django" : {"name": "Django", "created": 2005, "parent": "Python"},
"Bottle" : {"name": "Bottle", "created": 2009, "parent": "Python"},
"Tornado" : {"name": "Tornado", "created": 2010, "parent": "Python"},
}

 創(chuàng)建端點(diǎn)

現(xiàn)在您已經(jīng)有了 API 的骨架——它有一個(gè)實(shí)例化的應(yīng)用程序和一個(gè)資源。接下來,我們需要?jiǎng)?chuàng)建可以查詢的端點(diǎn)。為此,我們將使用 HTTP 動(dòng)詞 GET 從tutorial_app.py 檢索數(shù)據(jù):

@app.get('/frameworks')
def list_frameworks():
return {"frameworks":list(in_memory_datastore.values())}

這里有幾件事要提一下。首先,“/frameworks”區(qū)域定義了我們的端點(diǎn)。使用 GET HTTP 謂詞向該端點(diǎn)發(fā)出的請(qǐng)求將觸發(fā)此功能。對(duì)于其他端點(diǎn),您只需更改此名稱并生成新端點(diǎn)即可。其次,@app.get 是另一種方法的簡(jiǎn)寫。一些 Python 開發(fā)人員可能更熟悉“@app.route”——在這種情況下,app.get 和 app.route 是同一個(gè),只是構(gòu)建略有不同。

我們的方法如下所示:

@app.get('/frameworks')

另一種寫法如下:

@app.route('/frameworks', methods=["GET"])

請(qǐng)注意,這兩段代碼執(zhí)行相同的操作 – 我們的版本只是更短?;氐酱a中所寫的:

@app.get('/frameworks')
def list_frameworks():
return {"frameworks":list(in_memory_datastore.values())}

代碼的其余部分定義了一個(gè)帶有“frameworks”標(biāo)簽的 JSON 對(duì)象,并將其指向我們數(shù)據(jù)存儲(chǔ)中的值。這將允許我們?cè)L問 /frameworks 端點(diǎn)并查看所有資源的列表。為此,您可以導(dǎo)航至:

http://127.0.0.1:5000/frameworks

 實(shí)現(xiàn)CRUD功能

到目前為止,我們已經(jīng)有了一個(gè) API,可以讓我們檢索數(shù)據(jù)列表。我們需要做的是開始添加額外的 CRUD 功能。例如,我們可以利用 PUT 創(chuàng)建一個(gè)更新函數(shù)。為此,我們可以更新代碼以添加 POST 動(dòng)詞,從而在數(shù)據(jù)存儲(chǔ)中創(chuàng)建新條目。首先,我們需要?jiǎng)?chuàng)建創(chuàng)建函數(shù):

def create_framework(new_framework):
framework_name = new_framework['name']
in_memory_datastore[framework_name] = new_framework
return new_framework

這定義了一種將框架輸入系統(tǒng)的新方法。接下來,我們需要添加一個(gè)路由方法來支持 CLI 命令與端點(diǎn)交互:

@app.route('/frameworks'’, methods=['GET', 'POST'])
def frameworks_route():
if request.method == 'GET':
return list_frameworks()
elif request.method == "POST":
return create_framework(request.get_json(force=True))

可以對(duì) CRUD 功能所需的所有路由重復(fù)此操作。

 讓它變得寧靜

現(xiàn)在您已經(jīng)有了提供基本功能的 API 服務(wù),您將需要開始添加一些系統(tǒng)以真正使其成為 RESTful。第一步是利用有效的 HATEOAS 上下文系統(tǒng)。

目前市場(chǎng)上有多種選擇。 JSON-LD是一個(gè)很好的解決方案,它允許您提供鏈接數(shù)據(jù)作為資源的一部分。

在我們的實(shí)例中,這可能是這樣的:

{
"@context": "https://example.com/frameworks.jsonld",
"@id": "https://example.com/frameworks/Flask",
"relatedName": "Flask-RESTPlus",
"relatedDocs": "https://flask-restplus.readthedocs.io/",
}

這也是您可能需要開始考慮用于緩存、優(yōu)化等的額外框架的一點(diǎn)。一旦您擁有了一個(gè)穩(wěn)定的 API 可供使用,您就可以開始添加額外的安全和穩(wěn)定的功能,使您的應(yīng)用程序真正實(shí)現(xiàn) RESTful。

 最佳實(shí)踐

認(rèn)證與授權(quán)

確保您使用基于最小權(quán)限原則的身份驗(yàn)證和授權(quán)來部署服務(wù)。盡可能鎖定對(duì)資源的訪問。確保你的上下文參考是有效的,并且它們是值得的——超媒體很棒,但暴露任何東西并不是對(duì)一個(gè)更加封閉、非上下文世界的正確反應(yīng)。確保您提供的有用數(shù)據(jù)不會(huì)被用來對(duì)付您,并確保以安全的方式提供數(shù)據(jù)。

 API結(jié)構(gòu)

請(qǐng)記住,RESTful API 主要是面向資源的。資源應(yīng)該有一個(gè)具有特定功能的HTTP 動(dòng)詞,并且應(yīng)該是冪等的(例如,每次調(diào)用時(shí)響應(yīng)的類型都是相同的,即使內(nèi)容不同)。確保您充分鏈接到上下文信息并向客戶端提供緩存。確保您與本文開頭的 REST 考慮因素保持一致。

 結(jié)論

RESTful 設(shè)計(jì)并不難做,但往往很難做得正確。通過一些前瞻性的思考和規(guī)劃,您可以使用 Python 啟動(dòng)極其強(qiáng)大的 RESTful API。即使只是這篇文章中的代碼也可以成為下一個(gè)大型 API 的核心——它只需要一些想象力和規(guī)劃。

原文鏈接:https://www.moesif.com/blog/api-monetization/api-strategy/Creating-Python-APIs/

上一篇:

Python API 教程(初學(xué)者指南)

下一篇:

使用 Java 實(shí)施 API 分析
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

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

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

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

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)