模式是一種機器可讀文檔婆廊,用于描述可用的API端點碌冶,其URLS以及它們支持的操作朱盐。
模式可以是自動生成的文檔的有用工具购桑,也可以用于驅(qū)動可以與API進(jìn)行交互的動態(tài)客戶端庫畅铭。
核心API
為了提供模式支持REST框架使用Core API。
Core API是用于描述API的文檔規(guī)范勃蜘。它用于提供可用端點的內(nèi)部表示格式以及API暴露的可能交互硕噩。它可以用于服務(wù)器端或客戶端。
當(dāng)使用服務(wù)器端時缭贡,Core API允許API支持各種模式或超媒體格式的渲染炉擅。
當(dāng)客戶端使用時,Core API允許動態(tài)驅(qū)動的客戶端庫可以與暴露支持的模式或超媒體格式的任何API進(jìn)行交互阳惹。
添加模式
REST框架支持明確定義的模式視圖或自動生成的模式坑资。由于我們使用的是視圖和路由器,我們可以簡單地使用自動模式生成穆端。
您需要安裝coreapipython包才能包含API模式袱贮。
$?pip?install?coreapi
現(xiàn)在我們可以通過在URL配置中包含一個自動生成的模式視圖來為API添加模式。
from?rest_framework.schemas?import?get_schema_view
schema_view?=?get_schema_view(title='Pastebin?API')
urlpatterns?=?[
????url(r'^schema/$',?schema_view),
????...
]
如果您在瀏覽器中訪問API根端點体啰,則現(xiàn)在應(yīng)該可以看到corejson?表示形式作為選項可用攒巍。
我們還可以通過在Accept標(biāo)題中指定所需的內(nèi)容類型從命令行請求模式。
$?http?http://127.0.0.1:8000/schema/?Accept:application/coreapi+json
HTTP/1.0?200?OK
Allow:?GET,?HEAD,?OPTIONS
Content-Type:?application/coreapi+json
{
????"_meta":?{
????????"title":?"Pastebin?API"
????},
????"_type":?"document",
????...
默認(rèn)輸出樣式是使用Core JSON編碼荒勇。
還支持其他架構(gòu)格式柒莉,如Open API(以前稱為Swagger)。
使用命令行客戶端
現(xiàn)在我們的API暴露了架構(gòu)端點沽翔,我們可以使用動態(tài)客戶端庫來與API進(jìn)行交互兢孝。為了證明這一點,我們來使用Core API命令行客戶端仅偎。
命令行客戶端可用作coreapi-cli包:
$?pip?install?coreapi-cli
現(xiàn)在檢查它在命令行上可用...
$?coreapi
Usage:?coreapi?[OPTIONS]?COMMAND?[ARGS]...
??Command?line?client?for?interacting?with?CoreAPI?services.
??Visit?http://www.coreapi.org?for?more?information.
Options:
??--version??Display?the?package?version?number.
??--help?????Show?this?message?and?exit.
Commands:
...
首先跨蟹,我們將使用命令行客戶機加載API模式。
$?coreapi?get?http://127.0.0.1:8000/schema/
????snippets:?{
????????highlight(id)
????????list()
????????read(id)
????}
????users:?{
????????list()
????????read(id)
????}
我們還沒有認(rèn)證橘沥,所以現(xiàn)在我們只能看到只讀端點窗轩,這與我們?nèi)绾卧O(shè)置API的權(quán)限一致。
我們嘗試列出現(xiàn)有的片段座咆,使用命令行客戶端:
$?coreapi?action?snippets?list
[
????{
????????"url":?"http://127.0.0.1:8000/snippets/1/",
????????"id":?1,
????????"highlight":?"http://127.0.0.1:8000/snippets/1/highlight/",
????????"owner":?"lucy",
????????"title":?"Example",
????????"code":?"print('hello,?world!')",
????????"linenos":?true,
????????"language":?"python",
????????"style":?"friendly"
????},
????...
一些API端點需要命名參數(shù)痢艺。例如,要獲取特定代碼段的高亮度HTML介陶,我們需要提供一個id堤舒。
$?coreapi?action?snippets?highlight?--param?id=1
??Example
??...
認(rèn)證我們的客戶
如果我們想要創(chuàng)建,編輯和刪除片段哺呜,我們需要作為有效用戶進(jìn)行身份驗證舌缤。在這種情況下,我們只需使用基本的auth。
確保更換友驮,并與您的實際用戶名和密碼下面漂羊。
$?coreapi?credentials?add?127.0.0.1?:?--auth?basic
Added?credentials
127.0.0.1?"Basic?<...>"
現(xiàn)在驾锰,如果我們再次獲取架構(gòu)卸留,我們應(yīng)該能夠看到一整套可用的交互。
$?coreapi?reload
Pastebin?API?"http://127.0.0.1:8000/schema/">
????snippets:?{
????????create(code,?[title],?[linenos],?[language],?[style])
????????delete(id)
????????highlight(id)
????????list()
????????partial_update(id,?[title],?[code],?[linenos],?[language],?[style])
????????read(id)
????????update(id,?code,?[title],?[linenos],?[language],?[style])
????}
????users:?{
????????list()
????????read(id)
????}
我們現(xiàn)在可以與這些端點進(jìn)行交互椭豫。例如耻瑟,要創(chuàng)建新的代碼段:
$?coreapi?action?snippets?create?--param?title="Example"?--param?code="print('hello,?world')"
{
????"url":?"http://127.0.0.1:8000/snippets/7/",
????"id":?7,
????"highlight":?"http://127.0.0.1:8000/snippets/7/highlight/",
????"owner":?"lucy",
????"title":?"Example",
????"code":?"print('hello,?world')",
????"linenos":?false,
????"language":?"python",
????"style":?"friendly"
}
并刪除片段:
$?coreapi?action?snippets?delete?--param?id=7
除了命令行客戶端,開發(fā)人員還可以使用客戶端庫與您的API進(jìn)行交互赏酥。Python客戶端庫是第一個可用的喳整,并且計劃很快發(fā)布一個Javascript客戶端庫。
有關(guān)定制模式生成和使用Core API客戶端庫的更多詳細(xì)信息裸扶,您需要參考完整的文檔框都。
回顧我們的工作
我們擁有非常少量的代碼,現(xiàn)在擁有一個完整的可以瀏覽網(wǎng)頁的完整的pastebin Web API呵晨,它包含一個模式驅(qū)動的客戶端庫魏保,并且具有身份驗證,每個對象權(quán)限和多個渲染器格式摸屠。
我們已經(jīng)走過了設(shè)計過程的每一步谓罗,并且看到了如何自定義任何我們可以逐漸工作的方式來簡單地使用常規(guī)的Django視圖。
您可以查看GitHub上的最終教程代碼季二,或者嘗試沙盒中的實例檩咱。
向上和向上
我們已經(jīng)完成了我們的教程。如果您想要更多地參與到REST框架項目中胯舷,以下是您可以開始的幾個地方:
通過審查和提交問題刻蚯,提出請求,為GitHub做出貢獻(xiàn)桑嘶。
加入REST框架討論組芦倒,并幫助構(gòu)建社區(qū)。
跟隨Twitter上的作者不翩,并說你好兵扬。
現(xiàn)在去構(gòu)建真棒的東西。
Django REST FrameWork中文文檔目錄: