在開發Web應用中,有兩種應用模式:html
所謂的先後端不分離,就是先後端數據都在同一個服務器中,前端的樣式以及頁面渲染都由後端一次性渲染出來在前端瀏覽器中展現出來。前端
所謂的先後端分離,就是前端數據在單獨的一個服務器中,前端瀏覽器先行請求前端樣式文件而後根據前端樣式的請求在向後端請求特定的數據便可,這樣不在像之前安卓,IOS以及web瀏覽須要分別都須要本身的後端服務器,這樣多個客戶端只要請求統一的API接口,便可請求到指定的數據。節省後端開發的壓力。python
爲了在團隊內部造成共識、防止我的習慣差別引發的混亂,咱們須要找到一種你們都以爲很好的接口實現規範,並且這種規範可以讓後端寫的接口,用途一目瞭然,減小雙方之間的合做成本。git
目前市面上大部分公司開發人員使用的接口服務架構主要有:restful、rpc。github
post請求數據庫
action=get_all_student¶ms=301&sex=1django
接口多了,對應函數名和參數就多了,前端在請求api接口時,就會比較難找.容易出現重複的接口json
把後端全部的數據/文件都當作資源.後端
那麼接口請求數據,本質上來講就是對資源的操做了.
web項目中操做資源,無非就是增刪查改.因此要求在地址欄中聲明要操做的資源是什麼,而後經過http請求動詞來講明對資源進行哪種操做.
POST http://www.lufei.com/api/students/ 添加學生數據
GET http://www.lufei.com/api/students/ 獲取全部學生
DELETE http://www.lufei.com/api/students/<pk> 刪除1個學生
若是咱們想要理解restful,就要理解Representational State Transfer這個詞組的意思,表徵性狀態轉移。
這裏所說的表徵性,其實指的就是資源。一般咱們稱爲資源狀態轉移。
(1.)什麼是資源
任何事物,只要有被引用到的必要,它就是一個資源。
咱們在瀏覽器中看到的文本,視頻,圖片等等都是資源。這些都是實實在在存在的實體。
資源能夠是一個實體,也能夠是抽象概念。
好比說吧:
-- Alex的我的信息
-- 沛齊的手機號
-- Alex跟沛齊的潛在關係
這些都是資源,能夠是實體好比我的信息,手機號。也能夠是抽象的概念,好比兩我的的關係......
那麼在咱們的網絡中,咱們要引用資源,資源必定要有一個標識,在web中的惟一標識就是URI,
URI咱們不常據說,咱們常常用URL,那麼二者區別是什麼呢~
(2.)什麼是URI,URL
URI 統一資源標誌符。
URL 統一資源定位符。
URI是給咱們的資源進行標識的,URL是描述咱們資源地址的。
好比說咱們每一個人都有名字和身份證,名字可能重名,可是身份證是惟一的,
那麼身份證號就能夠是咱們的URI,標識咱們每一個人,也能夠說標識咱們每一個資源。
咱們能夠經過身份證號找到Alex,也能夠經過下面這種方式找到他.....
Alex的住址協議://地球/中國/屌絲省/屌絲市/寡婦村/250號街道/250號/Alex
這個就是咱們的URL,咱們經過這兩種方式均可以找到咱們的資源,
其實咱們的URL能夠說是URI的子集,經過定位的方式實現的URI。
這是咱們資源的定位~~有了資源的地址後,咱們要去訪問資源,那麼咱們要經過什麼方式去訪問呢~~
(3.)統一資源接口
如今咱們能夠經過URL去訪問到資源,那麼咱們對資源會有不少不一樣的操做,增刪改查,
之前咱們可能會爲了這個增長新設計一個URL,而後這個URL就是對數據進行增長的,
還會爲了更新和刪除分別設計一個URL,如今咱們不用了,咱們只有一個URL,
而後根據HTTP請求方式的不一樣,對資源進行不一樣的操做,這個就是是統一資源接口。
咱們必定要遵循HTTP請求方法的語義,也就是說POST請求就在新增數據等....
(4.)資源的表述
資源的表述其實就是資源的展示形式,咱們客戶端和服務端傳輸的都是資源的表述,而不是資源自己。
例如文本資源能夠採用html、xml、json等格式,圖片可使用PNG或JPG展示出來。
那麼客戶端如何知道服務端提供哪一種表述形式呢?
能夠經過HTTP內容協商,客戶端能夠經過Accept頭請求一種特定格式的表述,服務端則經過Content-Type告訴客戶端資源的表述形式。
這些資源的表述呈如今頁面上,就是咱們說的資源狀態。
咱們在看頁面的時候,從當前資源的表述(也能夠說狀態或者表現層)會跳轉到其餘的資源狀態。
服務端經過超媒體告訴客戶端當前狀態有哪些後續狀態能夠進入。
這些相似"下一頁"之類的連接起的就是這種推動狀態的做用——指引你如何從當前狀態進入下一個可能的狀態。
總結以下:
能夠得知REST風格的特色以下:
(1)在web中,只要有被引用的必要都叫資源。
(2)每一個URI表明一個資源,獨一無二的。
(3)客戶端經過HTTP的方法,對服務器端資源進行操做;
(4)客戶端和服務器之間,傳遞這種資源的某種表現層;
(5)經過超連接的指引,實現"表現層狀態轉移"。
REST全稱是Representational State Transfer,中文意思是表述性狀態轉移。 它首次出如今2000年Roy Fielding的博士論文中。
RESTful是一種定義Web API接口的設計風格,尤爲適用於先後端分離的應用模式中。
這種風格的理念認爲後端開發任務就是提供數據的,對外提供的是數據資源的訪問接口,因此在定義接口時,客戶端訪問的URL路徑就表示這種要操做的數據資源。
而對於數據資源分別使用POST、DELETE、GET、UPDATE等請求動做來表達對數據的增刪查改。
請求方法 | 請求地址 | 後端操做 |
GET | /students |
獲取全部學生 |
POST | /students | 增長學生 |
GET | /students/<pk> | 獲取編號爲pk的學生 |
PUT | /students/<pk> | 修改編號爲pk的學生 |
DELETE | /students/<pk> | 刪除編號爲pk的學生 |
事實上,咱們可使用任何一個框架均可以實現符合restful規範的API接口。
參看文檔:http://www.javashuo.com/article/p-cweepqpd-ey.html
api接口開發,最核心最多見的一個過程就是序列化,所謂序列化就是把數據轉換格式,序列化能夠分兩個階段:
序列化: 把咱們識別的數據轉換成指定的格式提供給別人。
例如:咱們在django中獲取到的數據默認是模型對象,可是模型對象數據沒法直接提供給前端或別的平臺使用,因此咱們須要把數據進行序列化,變成字符串或者json數據,提供給別人。
反序列化:把別人提供的數據轉換/還原成咱們須要的格式。
例如:前端js提供過來的json數據,對於python而言就是字符串,咱們須要進行反序列化換成模型類對象,這樣咱們才能把數據保存到數據庫中。
5.Django Rest_Framework
核心思想: 縮減編寫api接口的代碼
Django REST framework是一個創建在Django基礎之上的Web 應用開發框架,能夠快速的開發REST API接口應用。在REST framework中,提供了序列化器Serialzier的定義,能夠幫助咱們簡化序列化與反序列化的過程,不只如此,還提供豐富的類視圖、擴展類、視圖集來簡化視圖的編寫工做。REST framework還提供了認證、權限、限流、過濾、分頁、接口文檔等功能支持。REST framework提供了一個API 的Web可視化界面來方便查看測試接口。
中文文檔:https://q1mi.github.io/Django-REST-framework-documentation/#django-rest-framework
github: https://github.com/encode/django-rest-framework/tree/master
提供了定義序列化器Serializer的方法,能夠快速根據 Django ORM 或者其它庫自動序列化/反序列化;
提供了豐富的類視圖、Mixin擴展類,簡化視圖的編寫;
豐富的定製層級:函數視圖、類視圖、視圖集合到自動生成 API,知足各類須要;
多種身份認證和權限認證方式的支持;[jwt]
內置了限流系統;
直觀的 API web 界面;
可擴展性,插件豐富
a