接口:前臺與後臺進行信息交互的媒介 - url連接git
url連接:長得像返回數據的url連接數據庫
請求方式:get(查)、post(增)、put(總體改)、patch(局部改)、delete(刪)django
請求參數:拼接參數、數據包參數(urlencolded、form-data、json)json
響應結果:響應json數據api
一、安裝postman,同時支持各類操做系統,測試接口用的瀏覽器
Postman直接下載安裝便可安全
二、使用:服務器
建立簡單get請求測試restful
簡單post請求網絡
請求百度地圖接口案例
首先要知道咱們爲何要寫接口:做爲後臺開發者,要將後臺數據經過url連接反饋給前臺
爲何要寫文檔:由於涉及到前臺與後臺的交互,要知道該url 連接時說明請求方式、提交哪些數據、返回哪些結果
接口文檔就是給後臺開發、前臺開發、測試等各項目相關項目組同時查看的,方便團隊開發(規則是後臺來制定的,文檔也是後臺來寫的)
採用word編寫
drf框架插件,能夠根據CBV的類快速生成文檔,可是規定類要徹底符合規範
通常大多都採用寫文檔的平臺,好比YAPI、或者本身達服務器編寫文檔平臺
一、先安裝開發須要,完成接口的開發(設置後臺url請求方式、請求數據、響應結果)
二、選擇一個接口平臺,將後臺的url連接,請求方式,請求數據,響應結果等信息轉換成文檔便可(此處咱們用YAPI示例)
進入平臺後
新建項目
建立接口
編寫接口
先後臺分離的狀況下,後臺能夠採用不一樣的後臺運用,開發出相似的功能,因此先後臺請求響應的規則是一致的,若是按照一套標準來編寫接口,後臺不論是什麼語言,前臺不論是什麼請求(頁面、工具、代碼)先後臺都你進行交互
規定了url如何編寫,請求方式的含義,響應的數據規則
一、url編寫
HTTPS協議:內部採用了加密和解密保證了數據的安全性
api字眼:標識操做的是數據,https://www.baidu.con/api
v1/v2字眼:數據點不一樣版本共存,https://api.baidu.com/v2
資源複數:交互的數據咱們稱爲資源,https://api.baidu.com/books,通常不要出現動詞,除非特例好比search、login
拼接條件:過濾羣查接口數據(https://api.baidu.com/books/?limit=3&ordering=-price)
二、請求方式
/books/ - get - 羣查 /books/(pk)/ - get - 單查 /books/ - post - 單增 /books/(pk)/ - put - 單總體改 /books/(pk)/ - patch - 單局部改 /books/(pk)/ - delete - 單刪
三、響應結果
網絡狀態碼與狀態信息:2xx | 3xx | 4xx | 5xx
數據狀態碼:先後臺約定規則 - 0:成功 1:失敗 2:成功沒結果
數據狀態信息:自定義失敗和成功時的的信息接收(英文)
數據本體:json數據
數據資源:頭像、視頻等用url連接
一、路由綁定
FBV:url(r'^test/$', views.test),
項目啓動,將test函數地址綁定給 /test/ 路由
請求/test/訪問後臺,後臺就會從view中調用綁定的test函數
CBV:url(r'^test/$', views.Test.as_view()),
項目啓動,將as_view()函數的執行結果返回給view函數地址綁定的/test/路由
請求/test/訪問後臺,後臺就會調用綁定的view函數
view函數會將請求交個dispatch方法完成分發,分發(反射)給視圖類的不一樣方法處理不一樣的請求
二、業務處理
FBV:每個接口都會對應一個函數來響應請求
CBV:能夠將一個資源的增刪改查全部操做都放在一個類中管理,在內部再分方法逐一處理(高內聚低耦合:六個接口和一個類有關,但都能在類內部處理)
CBV使用:
url中導入views,類後.as_view() , ( url(r'^test/$', views.Test.as_view()),)
在views中導入View,三種導入方式:
from django.views import View from django.views.generc import View from django.views.generc.base import View
自定義類繼承View
目的:一、繼承as_view()方法,完成路由配置,二、繼承dispatch()方法,完成請求分發,三、若是本身寫了as_view()和dispatch()方法自定義視圖類就能夠不用繼承任何類了
class Test(View): def get(self, request, *args, **kwargs): return JsonResponse('cbv ok', safe=False) def post(self, request, *args, **kwargs): pass
pip install djangorestframework
在settings中APPS註冊
INSTALLED_APPS = [ # ... 'rest_framework', ]
drf配置的查找順序:自定義的settings中的REST_FRAMEWORK配置字典再到drf默認的setts的DEFAULTS
# 自定義drf配置 REST_FRAMEWORK = { }
特色功能在特色的功能模塊下面
from rest_framework.views import APIView # 視圖相關 from rest_framework.response import Response # 響應相關 from rest_framework.request import Request # 請求相關 from rest_framework.exceptions import APIException # 異常相關 from rest_framework.filters import SearchFilter # 搜索過濾相關 from rest_framework.pagination import PageNumberPagination # 分頁相關 from rest_framework.authentication import BaseAuthentication # 認證 from rest_framework.settings import APISettings # 配置
一、在models.py中建立Model類
class Books(models.Model): # verbose_name 可視化將name變爲'書名' name = models.CharField(max_length=32, verbose_name='書名') # 數字最長5位,包含小數兩位 price = models.DecimalField(max_digits=5, decimal_places=2) # 配置類,可視化 class Meta: verbose_name_plural='圖書' def __str__(self): return self.name
二、在admin.py中註冊Model類,方便後臺admin可視化管理數據
from django.contrib import admin from . import models # admin要控制的model都須要註冊一下 admin.site.register(models.Books)
三、執行數據庫遷移命令
makemigrations => migrate => 建立管理員createsuperuser => admin | admin123
四、瀏覽器登陸admin錄入數據
urlpatterns = [ # 資源books接口的設計 url(r'^books/$', views.BookAPIView.as_view()), # 羣查、單增 url(r'^books/(?P<pk>\d+)/$', views.BookAPIView.as_view()), # 單查、單刪、單(總體|局部)改 ]
from rest_framework.views import APIView from rest_framework.response import Response from . import models class BookAPIView(APIView): def _multiple_get(self): # 不能返回,數據是QuerySet[Obj, Obj],也不能強制轉換list # return list(models.Book.objects.all()) # QuerySet[dict, dict] # print(models.Book.objects.values('name', 'price')) # QuerySet[tuple, tuple] # print(models.Book.objects.values_list('name', 'price')) return Response(list(models.Book.objects.values('name', 'price'))) def _single_get(self, pk): # return Response(models.Book.objects.filter(pk=pk).values('name', 'price').first()) # 開發階段建議能用try的地方,不要使用if判斷 try: return Response(models.Book.objects.values('name', 'price').get(pk=pk)) except: return Response('資源不存在') # 單查、羣查 def get(self, request, *args, **kwargs): pk = kwargs.get('pk') if pk: # 單查邏輯 return self._single_get(pk) else: # 羣查邏輯 return self._multiple_get()