前言
REST 不是什么具體的軟件或者代碼,而是一種思想。現在流行前后端分離開發項目,一般用 json 來交換數據。
相信寫過模板的同學都知道,只要哪怕頁面中的數據有一絲絲變動,那整個頁面都需要重新渲染,這對性能無疑是巨大的浪費,並且頁面中只有一些元素會和數據相聯系,
比如列表中的 <li>
元素,如果數據有變化,能直接只更新 <li>
元素就好了,REST 就是為此而生。
REST簡介
什么是RESTful 面向資源?
先看REST是什么意思,英文Representational state transfer 表述性狀態轉移 其實就是對 資源 的表述性狀態轉移。
簡單的說:RESTful是一種架構的規范與約束、原則,符合這種規范的架構就是RESTful架構。
資源的地址 在web中就是URL (統一資源標識符)
資源是REST系統的核心概念。 所有的設計都是以資源為中心
結合項目怎么識別資源
1.商品加入購物車 購物車
2.提交訂單 訂單
3.創建用戶 用戶
圍繞資源進行 添加,獲取,修改,刪除,以及對符合特定條件的資源進行列表操作 。針對資源設計接口
關於規范與約束有哪些?
RESTful 架構的核心規范與約束:統一接口
分為四個子約束:
1.每個資源都擁有一個資源標識,每個資源的資源標識可以用來唯一地標明該資源
2.消息的自描述性
3.資源的自描述性。
4.HATEOAS Hypermedia As The Engine Of Application State(超媒體作為應用狀態引擎)
即客戶只可以通過服務端所返回各結果中所包含的信息來得到下一步操作所需要的信息,如到底是向哪個URL發送請求等。
也就是說,一個典型的REST服務不需要額外的文檔標示通過哪些URL訪問特定類型的資源,而是通過服務端返回的響應來標示到底能在該資源上執行什么樣的操作
目的:實現客戶端無需借助任何文檔即能調用到所有的服務器資源
基本實現
先安裝對應的模塊
pip install djangorestframework
pip install django-filter
在setting.py中加入配置參數
INSTALLED_APPS = (
...
'rest_framework',
)
models.py
class Card(models.Model):
'''銀行卡 基本信息 # 作者:上海悠悠,QQ交流群:750815713'''
card_id = models.CharField(max_length=30, verbose_name="卡號", default="")
card_user = models.CharField(max_length=10, verbose_name="姓名", default="")
add_time = models.DateField(auto_now=True, verbose_name="添加時間")
class Meta:
verbose_name_plural = '銀行卡賬戶'
verbose_name = "銀行卡賬戶_基本信息"
def __str__(self):
return self.card_id
views.py
from rest_framework import viewsets
from rest_framework import serializers
from .models import *
from django.http import QueryDict
from rest_framework.request import Request
def get_parameter_dic(request, *args, **kwargs):
# 作者:上海悠悠,QQ交流群:750815713
if isinstance(request, Request) == False:
return {}
query_params = request.query_params
if isinstance(query_params, QueryDict):
query_params = query_params.dict()
result_data = request.data
if isinstance(result_data, QueryDict):
result_data = result_data.dict()
if query_params != {}:
return query_params
else:
return result_data
class CardSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Card
fields = "__all__"
class CardViewSet(viewsets.ModelViewSet):
queryset = Card.objects.all()
serializer_class = CardSerializer
def get(self, request, *args, **kwargs):
params=get_parameter_dic(request)
return JsonResponse(data=params)
def post(self, request, *args, **kwargs):
params=get_parameter_dic(request)
return JsonResponse(data=params)
def put(self, request, *args, **kwargs):
params=get_parameter_dic(request)
return JsonResponse(data=params)
urls.py
from django.conf.urls import include
from hello import views
from rest_framework import routers
from django.conf.urls import url
# 作者:上海悠悠,QQ交流群:750815713
router = routers.DefaultRouter()
router.register(r'cards', views.CardViewSet)
urlpatterns = [
url(r'^', include(router.urls)),
]
測試接口
使用fiddler測試剛才寫的接口
get查看數據
發送get請求:http://127.0.0.1:8000/cards/
數據庫表里面數據為空
post提交數據
發送post請求:http://127.0.0.1:8000/cards/
提交成功后,查看數據庫,會發現新增了一條數據
查看數據
可以多新增幾個,查看所有的數據
只查看其中的一條數據,后面加上它的id,http://127.0.0.1:8000/cards/65/
編輯數據
編輯數據,發送put請求,后面接上它的id
刪除數據
刪除數據,用delete請求,后面接上它的id
刪除之后,剛才這個數據就沒有了