什么是接口
接口一般来讲分为两种:
(1)程序内部的接口:方法与方法、模块与模块之间的交互,程序内部抛出的接口,如登录发帖,发帖就必须要登录,如果不登录不能发帖,发帖和登录这两个模块之间就要有交互,就会抛出一个接口,进行内部系统调用。
(2)系统对外的接口:从别人的网站或服务器上获取资源或信息,对方不会提供数据库共享,只能提供一个写好的方法来获取数据,如购物网站和第三方支付之间,购物网站支付时可选择第三方支付方法,但第三方不会提供自己的数据库给购物网站,只会提供一个接口,供购物网站进行调用。
其中内部接口包括:上层服务与下层服务的接口,同级接口。
接口分类
一般也分为两种:
(1)webService接口:走soap协议通过http传输,请求报文和返回报文都是xml格式的。测试时需要通过工具才能进行调用、测试。少数公司还在使用这种接口,如医院等行业。
(2)http api接口:走http协议,通过路径来区分调用的方法,请求和报文都是key-value形式的,返回报文一般都是json串,有get和post等方法。目前来讲,是最常用的。如RESTful基于http协议的接口。
(3)dubbo接口: 走rpc协议,使用rpc协议进行远程调用,直接使用socket通信。传输效率高,并且可以统计出系统之间的调用关系、调用次数。使用Java语言开发,只能用于Java语言开发的项目间的通信,不具备跨语言,跨平台的特点!
接口返回的数据
接口返回的数据一般都是json字符串,json是一种通用的数据类型,格式为key-value。
前后端区别
前端:客户端。通俗来讲,一般情况下,web端或app端能看见的地方以及一些简单的校验,都属于前端,
并且网站上显示的后台管理不属于后端。
后端:服务器端。web端或app端的系统逻辑、如购物时扣除余额,微博发到哪里等都是由后端实现的。后端开发接口供前端调用,接口所在应用程序(服务)在服务器上跑。
Web接口开发
配置接口路径:
1.在项目文件下urls.py添加接口根路径:
#api
path(\'api/\',include(\'django_web.urls\')),
# url(r\'^api/\',include((\'django_web.urls\',\'django_web\'),namespace=\'django_web\')),
2.在app应用django_web下新建urls.py添加具体接口:
from django.urls import path
from django_web.views import views_api
#在django_web下创建urls.py,配置具体接口的二级目录
urlpatterns = [
# guest system interface:
# ex : /api/add_event/
path(\'add_event/\',views_api.add_event,name=\'add_event\'),
# ex : /api/get_event_list/
path(\'get_event_list/\',views_api.get_event_list,name=\'get_event_list\'),
# ex: /api/add_guest/
path(\'add_guest/\',views_api.add_guest,name=\'add_guest\'),
# ex: /api/get_guest_list/
path(\'get_guest_list/\',views_api.get_guest_list,name=\'get_guest_list\'),
# ex: /api/user_sign/
path(\'user_sign/\',views_api.user_sign,name=\'user_sign\'),
]
3.在创建接口视图函数view_api.py文件,实现具体接口:
# -*- coding: utf-8 -*-
from django_web.models import Event,Guest
from django.http import JsonResponse
from django.core.exceptions import ValidationError,ObjectDoesNotExist
from django.db.utils import IntegrityError
import json
from django.core import serializers
import time
#JsonResponse 默认传入参数是字典格式,如果不是,则报错。
#添加发布会接口
def add_event(request):
#POST请求
eid = request.POST.get(\'eid\',\'\')
name = request.POST.get(\'name\',\'\')
limit = request.POST.get(\'limit\',\'\')
status = request.POST.get(\'status\',\'\')
address = request.POST.get(\'address\',\'\')
start_time = request.POST.get(\'start_time\',\'\')
if eid == \'\' or name == \'\' or limit == \'\' or address == \'\' or start_time == \'\':
#ensure_ascii 禁用ascii码
return JsonResponse({\'status\':10021,\'message\':\'参数错误\'},json_dumps_params={\'ensure_ascii\':False})
result = Event.objects.filter(id=eid)
if result:
return JsonResponse({\'status\':10022,\'message\':\'发布会id已存在\'},json_dumps_params={\'ensure_ascii\':False})
result = Event.objects.filter(name=name)
if result:
return JsonResponse({\'status\':10023,\'message\':\'发布会名称已存在\'},json_dumps_params={\'ensure_ascii\':False})
if status == \'\':
status = 1
try:
Event.objects.create(id=eid,name=name,limit=limit,status=int(status),address=address,start_time=start_time)
except ValidationError:
error = \'开始日期格式错误,必须是:YYYY-MM-DD HH:MM:SS\'
return JsonResponse({\'status\':10024,\'message\':error})
return JsonResponse({\'status\':200,\'message\':\'添加成功\'})
# 发布会查询接口
def get_event_list(request):
# GET请求
eid = request.GET.get(\'eid\',\'\')
name = request.GET.get(\'name\',\'\')
if eid == \'\' and name == \'\':
return JsonResponse({\'status\':10021,\'message\':\'参数错误\'})
if eid != \'\':
event = {}
# 方法一:
# filter返回由对象组成的列表,特点:返回对象列表不存在,不报错,[].
# if result.exists():
# print("查询的发布会id是:%s"%result[0].id)
# print(type(result))
# # 序列化对象,转成类型字符串
# datas = serializers.serialize(\'json\',result)
# # 字符串转成字典,就没有\'\\'
# new_datas = json.loads(datas)
# return JsonResponse({\'status\': 10022, \'message\':new_datas})
# else:
# return JsonResponse({\'status\':10023,\'message\':\'查询对象结果为空\'})
# 方法二:
try:
result = Event.objects.get(id=eid)
except ObjectDoesNotExist:
return JsonResponse({\'status\':10023,\'message\':\'查询对象结果为空\'})
else:
#给字典添加键值对
event[\'name\'] = result.name
event[\'limit\'] = result.limit
event[\'status\'] = result.status
event[\'address\'] = result.address
event[\'start_time\'] = result.start_time
return JsonResponse({\'status\':200,\'message\':\'查询成功\',\'data\':event})
if name != \'\':
datas = []
# 模糊查询:name__contains
results = Event.objects.filter(name__contains=name)
print(results.first())
if results:
for i in results:
event = {}
# 给字典添加键值对
event[\'name\'] = i.name
event[\'limit\'] = i.limit
event[\'status\'] = i.status
event[\'address\'] = i.address
event[\'start_time\'] = i.start_time
datas.append(event)
return JsonResponse({\'status\':200,\'message\':\'查询成功\',\'datas\':datas})
else:
return JsonResponse({\'status\':10022,\'message\':\'查询的数据不存在\'})
# 添加嘉宾接口
def add_guest(request):
# POST请求
eid = request.POST.get(\'eid\',\'\')
realname = request.POST.get(\'realname\',\'\')
phone = request.POST.get(\'phone\',\'\')
email = request.POST.get(\'email\',\'\')
if eid == \'\' or realname == \'\' or phone == \'\' or email == \'\':
return JsonResponse({\'status\':10021,\'message\':\'参数错误\'},json_dumps_params={\'ensure_ascii\':False})
result = Event.objects.filter(id=eid)
if not result:
return JsonResponse({\'status\':10022,\'message\':\'发布会id不存在\'})
# 判断发布会状态是否有效
result = Event.objects.get(id=eid).status
if not result:
return JsonResponse({\'status\':10023,\'message\':\'发布会状态无效\'})
# object.get只返回一条数据,发布会只有一个,filter返回对象查询集,一个发布会下有多个嘉宾
event_limit = Event.objects.get(id=eid).limit # 发布会限制人数
guest_limit = Guest.objects.filter(event_id=eid) # 发布会已添加的嘉宾数
print(len(guest_limit))
print(event_limit)
if len(guest_limit) >= event_limit:
return JsonResponse({\'status\':10024,\'message\':\'发布会人数已满\'})
event_time = Event.objects.get(id=eid).start_time
#日期字符串转换成日期对象
timeArray = time.strptime(str(event_time),"%Y-%m-%d %H:%M:%S")
#返回以秒的日期,入参struct_time。
e_time = int(time.mktime(timeArray))
#获取当前时间(单位:秒)
n_time = int(time.time())
print(e_time)
print(n_time)
if n_time >= e_time:
return JsonResponse({\'status\':10025,\'message\':\'发布会已经开始了\'})
try:
Guest.objects.create(event_id=int(eid),phone=int(phone),sign=0,realname=realname,email=email)
except IntegrityError:
return JsonResponse({\'status\':10026,\'message\':\'手机号码重复\'})
result2 = Event.objects.filter(id=eid)
new_result = serializers.serialize(\'json\',result2)
print(result2)
return JsonResponse({\'status\':200,\'message\':\'成功添加嘉宾\',\'datas\':json.loads(new_result)})
# 查询嘉宾接口
def get_guest_list(request):
# GET请求
eid = request.GET.get(\'eid\',\'\') #关联发布会id
phone = request.GET.get(\'phone\',\'\')
if eid == \'\':
return JsonResponse({\'status\':10021,\'message\':\'发布会id不能为空\'})
#输入发布会id查询,查询发布会下所有嘉宾
if eid != \'\' and phone == \'\':
datas = []
results = Guest.objects.filter(event_id=eid)
if results:
for i in results:
guest_list = {}
guest_list[\'realname\'] = i.realname
guest_list[\'phone\'] = i.phone
guest_list[\'email\'] = i.email
guest_list[\'sign\'] = i.sign
datas.append(guest_list)
return JsonResponse({\'status\':200,\'message\':\'查询成功\',\'datas\':datas})
else:
return JsonResponse({\'status\':10022,\'message\':\'查询的数据不存在\'})
# 查询发布会下某个嘉宾
if eid != \'\' and phone != \'\':
guest = {}
try:
result = Guest.objects.get(event_id=eid,phone=phone)
except ObjectDoesNotExist:
return JsonResponse({\'status\':10023,\'message\':\'查询的结果为空\'})
else:
guest[\'realname\'] = result.realname
guest[\'phone\'] = result.phone
guest[\'sign\'] = result.sign
guest[\'email\'] = result.email
return JsonResponse({\'status\':200,\'message\':\'查询成功\',\'datas\':guest})
#嘉宾签到接口
def user_sign(request):
# POST接口
eid = request.POST.get(\'eid\',\'\')
phone = request.POST.get(\'phone\',\'\')
if eid == \'\' or phone == \'\':
return JsonResponse({\'status\':10021,\'message\':\'参数错误\'})
try:
result = Event.objects.get(id=eid)
except Event.DoesNotExist:
return JsonResponse({\'status\':10022,\'message\':\'发布会id不存在\'})
if result.status is False:
return JsonResponse({\'status\':10023,\'message\':\'发布会未开启\'})
#发布会时间
event_time = result.start_time
timeArray = time.strptime(str(event_time),"%Y-%m-%d %H:%M:%S")
e_time = int(time.mktime(timeArray))
#当前时间
n_time = int(time.time())
if n_time >= e_time:
return JsonResponse({\'status\':10024,\'message\':\'发布会时间已过\'})
#存在发布会后,再校验手机号码:
result = Guest.objects.filter(phone=phone)
if not result:
return JsonResponse({\'status\':10025,\'message\':\'手机号码不存在\'})
else:
for i in result:
if i.event_id == int(eid):
break
else:
return JsonResponse({\'status\':10026,\'message\':\'嘉宾不属于该发布会\'})
result = Guest.objects.get(event_id=eid,phone=phone)
if result.sign is True:
return JsonResponse({\'status\':10027,\'message\':\'嘉宾已签到\'})
else:
result.sign = True
result.save()
return JsonResponse({\'status\':200,\'message\':\'签到成功\'})
Postman接口测试
添加发布会接口
查询发布会接口
添加嘉宾接口
查询嘉宾接口
嘉宾签到接口
接口文档
总结
到此,以上web系统所开发的接口及测试都已完成。