?web 開發模式
RESTful規范
1 數據的安全保障
-
url鏈接一般都采用https協議進行傳輸
注:采用https協議,可以提高數據交互過程中的安全性
2 接口特征表現
-
用api關鍵字標識接口url:
- https://api.baidu.com
- https://www.baidu.com/api
注:看到api字眼,就代表該請求url鏈接是完成前后臺數據交互的
3 多數據版本共存
-
在url鏈接中標識數據版本
- https://api.baidu.com/v1
- https://api.baidu.com/v2
注:url鏈接中的v1、v2就是不同數據版本的體現(只有在一種數據資源有多版本情況下)
4 數據即是資源,均使用名詞(可復數)
-
接口一般都是完成前后臺數據的交互,交互的數據我們稱之為資源
- https://api.baidu.com/users
- https://api.baidu.com/books
- https://api.baidu.com/book
注:一般提倡用資源的復數形式,在url鏈接中獎勵不要出現操作資源的動詞,錯誤示范:https://api.baidu.com/delete-user
-
特殊的接口可以出現動詞,因為這些接口一般沒有一個明確的資源,或是動詞就是接口的核心含義
- https://api.baidu.com/place/search
- https://api.baidu.com/login
5 資源操作由請求方式決定(method)
- 操作資源一般都會涉及到增刪改查,我們提供請求方式來標識增刪改查動作
- https://api.baidu.com/books - get請求:獲取所有書
- https://api.baidu.com/books/1 - get請求:獲取主鍵為1的書
- https://api.baidu.com/books - post請求:新增一本書書
- https://api.baidu.com/books/1 - put請求:整體修改主鍵為1的書
- https://api.baidu.com/books/1 - patch請求:局部修改主鍵為1的書
- https://api.baidu.com/books/1 - delete請求:刪除主鍵為1的書
6 過濾,通過在url上傳參的形式傳遞搜索條件
- https://api.example.com/v1/zoos?limit=10:指定返回記錄的數量
- https://api.example.com/v1/zoos?offset=10:指定返回記錄的開始位置
- https://api.example.com/v1/zoos?page=2&per_page=100:指定第幾頁,以及每頁的記錄數
- https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回結果按照哪個屬性排序,以及排序順序
- https://api.example.com/v1/zoos?animal_type_id=1:指定篩選條件
7 響應狀態碼
7.1 正常響應
- 響應狀態碼2xx
- 200:常規請求
- 201:創建成功
7.2 重定向響應
- 響應狀態碼3xx
- 301:永久重定向
- 302:暫時重定向
7.3 客戶端異常
- 響應狀態碼4xx
- 403:請求無權限
- 404:請求路徑不存在
- 405:請求方法不存在
7.4 服務器異常
- 響應狀態碼5xx
- 500:服務器異常
8 錯誤處理,應返回錯誤信息,error當做key
{error: "無權限操作"
}
9 返回結果,針對不同操作,服務器向用戶返回的結果應該符合以下規范
GET /collection:返回資源對象的列表(數組)
GET /collection/resource:返回單個資源對象
POST /collection:返回新生成的資源對象
PUT /collection/resource:返回完整的資源對象
PATCH /collection/resource:返回完整的資源對象
DELETE /collection/resource:返回一個空文檔
10 需要url請求的資源需要訪問資源的請求鏈接
# Hypermedia API,RESTful API最好做到Hypermedia,即返回結果中提供鏈接,連向其他API方法,使得用戶不查文檔,也知道下一步應該做什么
{"status": 0,"msg": "ok","results":[{"name":"肯德基(羅餐廳)","img": "https://image.baidu.com/kfc/001.png"}...]
}
# 響應數據要有狀態碼、狀態信息以及數據本身
{"status": 0,"msg": "ok","results":[{"name":"肯德基(羅餐廳)","location":{"lat":31.415354,"lng":121.357339},"address":"月羅路2380號","province":"上海市","city":"上海市","area":"寶山區","street_id":"339ed41ae1d6dc320a5cb37c","telephone":"(021)56761006","detail":1,"uid":"339ed41ae1d6dc320a5cb37c"}...]
}
Django REST framework
1.DRF需要以下依賴:
- Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6)
- Django (1.10, 1.11, 2.0)
DRF是以Django擴展應用的方式提供的,所以我們可以直接利用已有的Django環境而無需從新創建。(若沒有Django環境,需要先創建環境安裝Django)
2.安裝
pip install djangorestframework
pip install pymysql
?或在pycharm里安裝django-rest-framework
在settings.py的INSTALLED_APPS中添加’rest_framework’。
INSTALLED_APPS = [...'rest_framework',
]
3.連接數據庫,建立ORM模型
ps:簡單實用數據庫可以使用django自帶,不需要配置過參數。
4.寫序列化類
想序列化那個字段,就寫那個字段
from rest_framework import serializersclass BookSerializer(serializers.Serializer):id=serializers.CharField()name=serializers.CharField()price=serializers.CharField()author=serializers.CharField()publish=serializers.CharField()
5. 在視圖類中,實例化的到序列化的對象
a.使用rest_framework的Response
b.book_ser.data是字典
from rest_framework.views import APIView
from app01.models import Book
from app01.ser import BookSerializer
from rest_framework.response import Responseclass BookView(APIView):def get(self,request,pk):book=Book.objects.filter(id=pk).first()book_ser=BookSerializer(book) #調用類的__init__# book_ser.data 序列化對象.data 就是序列化后的字典return Response(book_ser.data)