天天看點

基于Django RESTframework設計Restful API導語什麼是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用總結

  關于restful的問題,在最近的面試中遇到很多,之前有過一定的了解,但沒有系統性的總結分析。是以現在結合django restframework來加深對restful的了解,同時梳理這過程的一些知識點。
 這個問題是最容易想到的,首先要分析這個問題,網上的其他文章都會講到有關rest(representational state transfer),中文翻譯:”表述性狀态傳遞“,再白話一點就是對資源的表述性狀态傳遞。剛開始,看到這裡頭都大了,那我們來看看其中比較關鍵需要了解到的知識點。
 這裡的資源指的是網絡上的每一個實體,而每一個實體都有着對應的uri(統一資源辨別符),如果需要通路這個資源,可以通過通路它的uri即可。
 簡單來說就是資源的表現形式,比如圖檔、html、文本等等。
  用戶端可以通過get、post、put、delete http動詞來操作資源。
  rest從資源的角度來審視整個網絡,将分布再網絡中某個結點通過uri進行辨別,而用戶端和服務端傳遞的是資源的某種表現層,并且用戶端通過http動詞,對伺服器資源操作,實作”表述性狀态轉化“。(表述性:用戶端請求一個資源,并且通過伺服器拿到資源)  滿足以上這些限制條件和原則的應用程式或設計就是restful。換言之restful就是一種架構的規範和限制。
對api的設計來講,restful是如今常見的的設計規範,通常用于web資料接口的設計。這裡講講從網上大緻總結的幾個restful api的設計細節。
 用戶端使用”動詞+賓語"的結構操作伺服器資源,動詞指的是http動詞,賓語指的是資源。http動詞對應的伺服器資源操作: get(select):從伺服器取出資源(一項或多項)。 post(create):在伺服器建立一個資源。 put(update):在伺服器更新資源(用戶端提供改變後的完整資源)。 patch(update):在伺服器更新資源(用戶端提供改變的屬性)。 delete(delete):從伺服器删除資源。
 由于賓語是api中的uri,是http動詞作用的的對象,應該是名詞,而不是動詞。
 對于uri建議使用複數
用戶端的每一次請求,伺服器給出回應,而回應包括http狀态碼和資料兩部分。 http狀态碼的含義: 1xx:相關資訊 2xx:操作成功 3xx:重定向 4xx:用戶端錯誤 5xx:伺服器錯誤
 api傳回的資料格式,不應該是一個純文字,應該是一個json對象,這樣才符合結構化流程。同樣伺服器回應的http頭的content-type屬性同樣要設定為application/json。
 在發生錯誤的時候,不應該傳回一個200狀态碼,然後把錯誤資訊放在資料體裡,因為這樣會導緻需要解析完資料體才能知道操作失敗。
 django restframework是一個基于django上建構符合restful風格web api,并且自身還帶有測試的頁面,友善測試自己的api,是以對于”前後端分離“的開發模式來講十分合适。
 前後端分離指的是後端來說隻需要提供資料接口,不再渲染模闆,前端隻需要擷取資料并且呈現。這樣的有許多優點: 前後端解耦,接口複用,減少開發量 各司其職,前後端同步開發,提升工作效率,定好接口規範 更利于調試、測試和運維
rest framework基本元件: apiview 解析器元件:對請求的資料進行解析,根據不同請求題進行解析 序列化元件:類似于django的form,可以通過自定義操作獲得想要的資料形式 視圖類(mixin) 認證元件 權限元件 頻率元件 分頁元件 響應器元件 url注冊器
 關于django的視圖函數,可以基于fbv模式也可以基于cbv模式: fbv模式:django的路由映射表裡進行url和視圖函數的關聯 cbv模式:而cbv模式則是在views.py中定義視圖類,在視圖類中視圖函數,如(get,post,put,delete)等  django restframework就是基于cbv模式,當一個http請求到達django後,首先執行中間件的方法,然後在進行路由比對。
基于Django RESTframework設計Restful API導語什麼是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用總結
 當路由比對後,會執行自定義類中的as_view()方法,如果不存在則會調用父類的as_view()方法,最後再調用到dispatch()方法處理不同request請求,執行不同的方法。(這段過程中設計到django cbv模式的處理流程,以及一些源碼知識)

安裝django restframework:

基于Django RESTframework設計Restful API導語什麼是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用總結

建立項目,建立應用,修改settings.py

settings.py(将rest_framework新增到installed_apps)

基于Django RESTframework設計Restful API導語什麼是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用總結

(其餘的修改資料庫配置、修改語言、時區就不一一列出來)

項目檔案樹:

基于Django RESTframework設計Restful API導語什麼是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用總結

設計一個有關于存儲歌曲的詳細資訊表(music/models.py):

同步資料庫:

建立一個序列化serialier類,提供序列化和反序列化的途徑,使之可以轉化為如json的表現形式,類似于django的form表單的原理。在music目錄下,建立serializers.py:

通過前面提到的cbv模式,設計視圖處理函數和路由映射:

crawl/urls.py

music/urls.py

music/views.py

代碼詳解:

 代碼比較簡單,主要就是繼承restframework架構的通用視圖函數generics,或者apiview。如果先省事,建議generics,因為提供的通用視圖可以允許你快速建構與資料相關的api視圖,當然如果覺得通用視圖不适合自己的api需求,可以使用apiview類。 (在這裡兩種方式都用到了,可以對比他們的差別)

模拟請求api接口(get、post請求)

基于Django RESTframework設計Restful API導語什麼是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用總結
基于Django RESTframework設計Restful API導語什麼是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用總結
基于Django RESTframework設計Restful API導語什麼是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用總結

自帶的測試頁面:

基于Django RESTframework設計Restful API導語什麼是RESTful?RESTful APIDjango RestFrameworkDjango RESTframework使用總結
剛開始接觸到restful方面的知識還是非常懵的,對網上很多文章感覺講的也不是很全面,是以索性總結一下,然後接觸到restframework架構也發現到了很多在django方面不熟悉的地方,如cbv模式,以及工作的原理,有些都牽扯到架構内的源碼,也是從網上一些優秀的文章一點點慢慢了解到,之後對django restframework相關知識也會繼續總結學習,下面是我在網上參考的一些文章,有興趣的可以了解一下。

參考連結:

https://www.cnblogs.com/renpingsheng/p/9531649.html https://www.cnblogs.com/renpingsheng/p/9534984.html#feedback https://www.jianshu.com/p/08a998f74ac7