1. 程式人生 > >RESTFULL 01 規範

RESTFULL 01 規範

取出 dispatch dump **kwargs 內部 最好 專用 軟件 都是

RESTFULL規範

一:什麽是RESTFULL

它是一個規範,面向資源架構

- REST與技術無關,代表的是一種軟件架構風格,REST是Representational State Transfer的簡稱,中文翻譯為“表征狀態轉移”
- REST從資源的角度類審視整個網絡,它將分布在網絡中某個節點的資源通過URL進行標識,客戶端應用通過URL來獲取資源的表征,獲得這些表征致使這些應用轉變狀態
- REST與技術無關,代表的是一種軟件架構風格,REST是Representational State Transfer的簡稱,中文翻譯為“表征狀態轉移”
- 所有的數據,不過是通過網絡獲取的還是操作(增刪改查)的數據,都是資源,將一切數據視為資源是REST區別與其他架構風格的最本質屬性
- 對於REST這種面向資源的架構風格,有人提出一種全新的結構理念,即:面向資源架構(ROA:Resource Oriented Architecture)

二:RESTFULL API 規範(10條)

1 API與用戶的通信協議,總是使用HTTPs協議
2域名

  • https://api.example.com 盡量將API部署在專用域名(會存在跨域問題)
  • https://example.org/api/ API很簡單

3 版本

  • URL,如:https://api.example.com/v1/

  • 請求頭 跨域時,引發發送多次請求-把版本號放在請求頭中

    127.0.0.1/book/1

4 路徑,視網絡上任何東西都是資源,均使用名詞表示(可復數) 必須說出來
127.0.0.1/get_all_book/ 以前你這麽寫
127.0.0.1/books/
5 method,通過請求方式來表示進行的操作

  • GET :從服務器取出資源(一項或多項)
  • POST :在服務器新建一個資源
  • PUT :在服務器更新資源(客戶端提供改變後的完整資源)
  • PATCH :在服務器更新資源(客戶端提供改變的屬性)
  • DELETE :從服務器刪除資源

? 127.0.0.1/books/ get請求:表示獲取所有圖書
? 127.0.0.1/books/1 get請求:表示獲取id為1的圖書
? 127.0.0.1/books/ post請求:表示新增一本書
? 127.0.0.1/books/ delete請求:表示刪除一本書
? 127.0.0.1/books/ put/patch請求:表示修改一本書
6 過濾,通過在url上傳參的形式傳遞搜索條件
7 狀態碼

? 1 開頭:服務器正在處理
? 2 開頭:服務器處理成功
? 3 開頭:重定向
? 4 開頭:客戶端錯誤
? 5 開頭:服務器錯誤
? 註意:在返回的數據中攜帶狀態碼
8 錯誤處理,應返回錯誤信息,error當做key

{
    error: "Invalid API key"
}

9 返回結果針對不同操作,返回數據格式要求

GET /collection:返回資源對象的列表(數組)
GET /collection/resource:返回單個資源對象
POST /collection:返回新生成的資源對象
PUT /collection/resource:返回完整的資源對象
PATCH /collection/resource:返回完整的資源對象
DELETE /collection/resource:返回一個空文檔

10 返回結果中提供鏈接,Hypermedia API,RESTful API最好做到Hypermedia,即返回結果中提供鏈接,連向其他API方法,使得用戶不查文檔,也知道下一步應該做什麽

{"link": {
  "rel":   "collection https://www.example.com/zoos",
  "href":  "https://api.example.com/zoos",
  "title": "List of zoos",
  "type":  "application/vnd.yourformat+json"
}}

三、基於原生django寫resful規範的接口

路由系統:

urlpatterns = [
    url(r'^users/$', views.Users.as_view()),
    url(r'^users2/$', views.user2),

]

視圖函數:

import json

def  user2(request):
    if request.method=='GET':
        dic = {'status':200,'name': 'lqz2', 'age': 18}
        return HttpResponse(json.dumps(dic))
    elif request.method=='POST':
        dic = {'status': 200, 'msg': '修改成功'}
        return JsonResponse(dic)

class Users(View):
    def get(self, request):
        dic = {'status':200,'name': 'lqz', 'age': 18}
        return HttpResponse(json.dumps(dic))

    def post(self, request):
        dic = {'status': 200, 'msg': '修改成功'}
        return JsonResponse(dic)

四、CBV源碼執行過程

-路由寫成:url(r'^books/', views.Books.as_view()),
-當程序啟動,第二個位置其實已經放了一個函數的內存地址了(as_view內部view這個函數)
-比如來了一個get請求,拿到第二個位置參數內存地址加括號執行(request,*args,**kwargs),其實就是view(request,*args,**kwargs)
        -本質就是執行了dispatch(request,*args,**kwargs)方法
        -dispatch方法內部通過請求方式(get,post),反射出要執行的方法,去執行,然後返回

五、APIView的源碼執行流程

比如get請求來了,執行View的as_view方法內部的view閉包函數,view閉包函數中執行了dispatch方法,
現在再執行dispatch,就已經不是View的dispatch,是APIView的dispatch方法了

RESTFULL 01 規範