RESTFULL 01 規範
阿新 • • 發佈:2019-03-25
取出 dispatch dump **kwargs 內部 最好 專用 軟件 都是
? 1 開頭:服務器正在處理
? 2 開頭:服務器處理成功
? 3 開頭:重定向
? 4 開頭:客戶端錯誤
? 5 開頭:服務器錯誤
? 註意:在返回的數據中攜帶狀態碼
8 錯誤處理,應返回錯誤信息,error當做key
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 狀態碼
? 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 規範