Python3 API 的封裝及調用
一、API 的封裝
API(Application Programming Interface,應用程序編程介面)是一些預先定義的函數,目的是提供應用程序與開發人員基於某軟體或硬體得以訪問一組常式的能力,而又無需訪問源碼,或理解內部工作機制的細節。
Python3 的介面就是WSGI:Web Server Gateway Interface。
WSGI介面定義非常簡單,它只要求Web開發者實現一個函數,就可以響應HTTP請求。我們來看一個最簡單的Web版本的:
上面的application()函數就是符合WSGI標準的一個HTTP處理函數,它接收兩個參數:
在application()函數中,調用:
就發送了HTTP響應的Header,注意Header只能發送一次,也就是只能調用一次函數。函數接收兩個參數,一個是HTTP響應碼,一個是一組list表示的HTTP Header,每個Header用一個包含兩個str的tuple表示。
通常情況下,都應該把Content-Type頭髮送給瀏覽器。其他很多常用的HTTP Header也應該發送。
然後,函數的返回值將作為HTTP響應的Body發送給瀏覽器。
有了WSGI,我們關心的就是如何從environ這個dict對象拿到HTTP請求信息,然後構造HTML,通過start_response()發送Header,最後返回Body。
整個application()函數本身沒有涉及到任何解析HTTP的部分,也就是說,底層代碼不需要我們自己編寫,我們只負責在更高層次上考慮如何響應請求就可以了。
不過,等等,這個application()函數怎麼調用?如果我們自己調用,兩個參數environ和start_response我們沒法提供,返回的bytes也沒法發給瀏覽器。
所以application()函數必須由WSGI伺服器來調用。有很多符合WSGI規範的伺服器,我們可以挑選一個來用。但是現在,我們只想儘快測試一下我們編寫的application()函數真的可以把HTML輸出到瀏覽器,所以,要趕緊找一個最簡單的WSGI伺服器,把我們的Web應用程序跑起來。
Python3 內置了一個WSGI伺服器,這個模塊叫wsgiref,它是用純Python編寫的WSGI伺服器的參考實現。所謂「參考實現」是指該實現完全符合WSGI標準,但是不考慮任何運行效率,僅供開發和測試使用。
運行WSGI服務
我們先編寫hello.py,實現Web應用程序的WSGI處理函數:
然後,再編寫一個server.py,負責啟動WSGI伺服器,載入application()函數:
運行結果:
這是最簡單的 WSGI 應用,接下里寫一個在日常工作中自己測試API的簡易程序
實例
運行結果:
使用裝飾器的方法最大好處是降低了程序的複雜度,我們只需要關心自己寫的函數 即可,最後在函數上方使用一個 就可以使程序直接運行,大大加快了開發效率。
二、API 的調用
API 的調用可以使用 Python3 自帶的模塊 ,這裡介紹一種更為好用的第三方模塊 。
運行結果:
這只是 ,最簡單的 GET 用法,還有 POST 用法、字典傳參等其他更詳細的用法請移步官網:http://cn.python-requests.org/zh_CN/latest/
三、API 編寫規範 REST
可以總結為一句話:REST是所有Web應用都應該遵守的架構設計指導原則。
Representational State Transfer,翻譯是「表現層狀態轉化」,維基百科有詳細說明:https://zh.wikipedia.org/wiki/具象狀態傳輸。
面向資源是REST最明顯的特徵,對於同一個資源的一組不同的操作。資源是伺服器上一個可命名的抽象概念,資源是以名詞為核心來組織的,首先關注的是名詞。REST要求,必須通過統一的介面來對資源執行各種操作。對於每個資源只能執行一組有限的操作。(7個HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS)
什麼是RESTful API?
符合REST架構設計的API。
總結
符合REST設計標準的API,即RESTful API。REST架構設計,遵循的各項標準和準則,就是HTTP協議的表現,換句話說,HTTP協議就是屬於REST架構的設計模式。比如,無狀態,請求-響應。
四、RESTful API 設計指南
轉載自大神阮一峰的博客:http://www.ruanyifeng.com/blog/2014/05/restful_api
網路應用程序,分為前端和後端兩個部分。當前的發展趨勢,就是前端設備層出不窮(手機、平板、桌面電腦、其他專用設備......)。
因此,必須有一種統一的機制,方便不同的前端設備與後端進行通信。這導致API構架的流行,甚至出現"API First"的設計思想。RESTful API是目前比較成熟的一套互聯網應用程序的API設計理論。我以前寫過一篇《理解RESTful架構》,探討如何理解這個概念。
今天,我將介紹RESTful API的設計細節,探討如何設計一套合理、好用的API。
一、協議
API與用戶的通信協議,總是使用HTTPs協議。
二、域名
應該盡量將API部署在專用域名之下。
如果確定API很簡單,不會有進一步擴展,可以考慮放在主域名下。
三、版本(Versioning)
應該將API的版本號放入URL。
另一種做法是,將版本號放在HTTP頭信息中,但不如放入URL方便和直觀。Github採用這種做法。
四、路徑(Endpoint)
路徑又稱"終點"(endpoint),表示API的具體網址。
在RESTful架構中,每個網址代表一種資源(resource),所以網址中不能有動詞,只能有名詞,而且所用的名詞往往與資料庫的表格名對應。一般來說,資料庫中的表都是同種記錄的"集合"(collection),所以API中的名詞也應該使用複數。
舉例來說,有一個API提供動物園(zoo)的信息,還包括各種動物和僱員的信息,則它的路徑應該設計成下面這樣。
五、HTTP動詞
對於資源的具體操作類型,由HTTP動詞表示。
常用的HTTP動詞有下面五個(括弧里是對應的SQL命令)。
還有兩個不常用的HTTP動詞。
六、過濾信息(Filtering)
如果記錄數量很多,伺服器不可能都將它們返回給用戶。API應該提供參數,過濾返回結果。
下面是一些常見的參數。
七、狀態碼(Status Codes)
伺服器向用戶返回的狀態碼和提示信息,常見的有以下一些(方括弧中是該狀態碼對應的HTTP動詞)。
狀態碼的完全列表參見這裡:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
八、錯誤處理(Error handling)
如果狀態碼是4xx,就應該向用戶返回出錯信息。一般來說,返回的信息中將error作為鍵名,出錯信息作為鍵值即可。
九、返回結果
針對不同操作,伺服器向用戶返回的結果應該符合以下規範。
十、Hypermedia API
RESTful API最好做到Hypermedia,即返回結果中提供鏈接,連向其他API方法,使得用戶不查文檔,也知道下一步應該做什麼。
上面代碼表示,文檔中有一個link屬性,用戶讀取這個屬性就知道下一步該調用什麼API了。rel表示這個API與當前網址的關係(collection關係,並給出該collection的網址),href表示API的路徑,title表示API的標題,type表示返回類型。
上面代碼表示,伺服器給出了提示信息,以及文檔的網址。
十一、其他
(1)API的身份認證應該使用OAuth 2.0框架。
(2)伺服器返回的數據格式,應該盡量使用JSON,避免使用XML。
※小白教程-快速安裝Python 3.X
※練習 13-15 Learn Python 3 The Hard Way
TAG:Python |