一切皆是資源,操做只是請求方式html
在url 中體現出操做行爲數據庫
/books/ books /books/add/ addbook /books/(\d+)/change/ changebook /books/(\d+)/delete/ delbook
不在url中體現操做行爲,在視圖函數區分,(提交,查看)django
對於須要令傳入參數的url 在作區分 (編輯,刪除)編程
/books/ -----get books ----- 返回當前全部數據 /books/ -----post books ----- 返回提交數據 /books/(\d+)-----get bookdetail ----- 返回當前查看的單條數據 /books/(\d+)-----put bookdetail ----- 返回更新數據 /books/(\d+)-----delete bookdetail ----- 返回空
即 URL 設計區別json
原來都是在 url 中設置。這樣能夠大大減小 url 的數量api
GET / POST / PUT / DELETE / PATCH
視 URL 爲資源緩存
http://www.yangtuo.com
http://v1.yangtuo.com http://v2.yangtuo.com
不單單侷限於 URL 中,也能夠經過請求頭之類的其餘方法進行加入版本字段安全
http://api.yangtuo.com http://yangtuo.com/api/salary
https://www.yangtuo.com
core: 200 300 400 500 return HttpResponse("text_data",status=300)
常見狀態碼服務器
OK - [GET]:服務器成功返回用戶請求的數據,該操做是冪等的(Idempotent)。 CREATED - [POST/PUT/PATCH]:用戶新建或修改數據成功。 Accepted - [*]:表示一個請求已經進入後臺排隊(異步任務) NO CONTENT - [DELETE]:用戶刪除數據成功。 INVALID REQUEST - [POST/PUT/PATCH]:用戶發出的請求有錯誤,服務器沒有進行新建或修改數據的操做,該操做是冪等的。 Unauthorized - [*]:表示用戶沒有權限(令牌、用戶名、密碼錯誤)。 Forbidden - [*] 表示用戶獲得受權(與401錯誤相對),可是訪問是被禁止的。 NOT FOUND - [*]:用戶發出的請求針對的是不存在的記錄,服務器沒有進行操做,該操做是冪等的。 Not Acceptable - [GET]:用戶請求的格式不可得(好比用戶請求JSON格式,可是隻有XML格式)。 Gone -[GET]:用戶請求的資源被永久刪除,且不會再獲得的。 Unprocesable entity - [POST/PUT/PATCH] 當建立一個對象時,發生一個驗證錯誤。 INTERNAL SERVER ERROR - [*]:服務器發生錯誤,用戶將沒法判斷髮出的請求是否成功。
http://yangtuo.com/v2/api/salary?page=1&size=10
不一樣視圖都要返回具備標識意義的返回值restful
http://yangtuo.com/v2/api/salary
GET: 返回全部的列表
[{"id":1,"title":"lala"},
{"id":2,"title":"wawa"},
{"id":3,"title":"kaka"},]
POST: 返回新增的數據
{"id":1,"title":"tuotuo"}
PUT: 更新所有的數據 返回更新數據
PATCH: 更新少許數據 返回更新數據
DELETE: 刪除數據 返回空
若是存在異常要基於錯誤碼返回錯誤信息
{
code:10000, error:"xxx錯了"
}
返回信息的時候加上 api ,即返回的數據最好加上 URL 信息這樣方便下面操做
{"link": { "rel": "collection https://www.example.com/zoos", "href": "https://api.example.com/zoos", "title": "List of zoos", "type": "application/vnd.yourformat+json" }}
記憶方式
URL 5個 https(推薦用https)://v2(版本)/yangtuo.com(域名爲資源)/api(體現api)/salary?page=1&size=10(有條件) 請求 1 個 根據method 不一樣,進行不一樣的操做 返回 4個 返回值 響應式設置狀態碼 返回錯誤信息 返回信息的時候加上api
幫助咱們快速開發基於 restful 規範的接口
- 能夠經過as_view傳參數,根據請求方式不一樣執行相應的方法
- 能夠在url中設置一個結尾,相似於: .json
- 幫助開發者提供了一些類,並在類中提供了多個方法以供咱們使用。
- 在url中設置version參數,用戶請求時候傳入參數。在request.version中獲取版本,根據版本不一樣作不一樣處理
- 寫一個類並註冊到認證類,在類的的authticate方法中編寫認證邏輯。
- 認證成功(user,auth)
- raise AuthticateFaild(....)
- None
- 寫一個類並註冊到權限類,在類的的has_permission方法中編寫認證邏輯。
- True
- False
- 寫一個類並註冊到頻率類,在類的的 allow_request/wait 方法中編寫認證邏輯。
allow_request
- True
- False 若是返回False,那麼就要執行wait
- 根據ContentType請求頭,選擇不一樣解析器對 請求體中的數據進行解析。
POST /index/ http1.1.\r\nhost:11.11.11.11\r\nContent-Type:url-formendo.... \r\n\r\nuser=alex&age=123
POST /index/ http1.1.\r\nhost:11.11.11.11\r\nContent-Type:application/json\r\n\r\n{....}
- 對從數據庫中獲取到的數據進行分頁處理: SQL -> limit offset
- 根據頁碼
http://www.luffycity.com/api/v1/student/?page=1&size=10
- 根據索引
http://www.luffycity.com/api/v1/student/?offset=60&limit=10
- 根據加密
http://www.luffycity.com/api/v1/student/?page=erd6ops5
- 對queryset序列化以及對請求數據格式校驗。
- 根據URL中傳入的後綴,決定在數據如何渲染到到頁面上。
- 基於序列化組件完成序列化後的 data 進行 Response
頁碼越大速度越慢,爲何以及如何解決? 緣由: 頁碼越大向後須要掃描的行數越多,由於每次都是從0開始掃描。 解決: - 限制顯示的頁數 - 記錄當前頁數據ID最大值和最小值,再次分頁時,根據ID現行篩選,而後再分頁。
發送請求--> Django的wsgi--> 中間件--> 路由系統_執行CBV的as_view(),就是執行內部的dispath方法--> 在執行dispath以前,有版本分析 和 渲染器--> 在dispath內,對request封裝--> 版本--> 認證--> 權限--> 限流--> 視圖--> 若是視圖用到緩存( request.data or request.query_params )就用到了 解析器--> 視圖處理數據,用到了序列化(對數據進行序列化或驗證) --> 視圖返回數據能夠用到分頁