接口:前台与后台进行信息交互的媒介 - 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()