什么是接口
接口一般來講分為兩種:
(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系統所開發的接口及測試都已完成。
