接口通常來說分爲兩種:前端
(1)程序內部的接口:方法與方法、模塊與模塊之間的交互,程序內部拋出的接口,如登陸發帖,發帖就必需要登陸,若是不登陸不能發帖,發帖和登陸這兩個模塊之間就要有交互,就會拋出一個接口,進行內部系統調用。web
(2)系統對外的接口:從別人的網站或服務器上獲取資源或信息,對方不會提供數據庫共享,只能提供一個寫好的方法來獲取數據,如購物網站和第三方支付之間,購物網站支付時可選擇第三方支付方法,但第三方不會提供本身的數據庫給購物網站,只會提供一個接口,供購物網站進行調用。數據庫
其中內部接口包括:上層服務與下層服務的接口,同級接口。django
通常也分爲兩種:json
(1)webService接口:走soap協議經過http傳輸,請求報文和返回報文都是xml格式的。測試時須要經過工具才能進行調用、測試。少數公司還在使用這種接口,如醫院等行業。後端
(2)http api接口:走http協議,經過路徑來區分調用的方法,請求和報文都是key-value形式的,返回報文通常都是json串,有get和post等方法。目前來說,是最經常使用的。如RESTful基於http協議的接口。api
(3)dubbo接口: 走rpc協議,使用rpc協議進行遠程調用,直接使用socket通訊。傳輸效率高,而且能夠統計出系統之間的調用關係、調用次數。使用Java語言開發,只能用於Java語言開發的項目間的通訊,不具有跨語言,跨平臺的特色!服務器
接口返回的數據通常都是json字符串,json是一種通用的數據類型,格式爲key-value。app
前端:客戶端。通俗來說,通常狀況下,web端或app端能看見的地方以及一些簡單的校驗,都屬於前端,
而且網站上顯示的後臺管理不屬於後端。socket
後端:服務器端。web端或app端的系統邏輯、如購物時扣除餘額,微博發到哪裏等都是由後端實現的。後端開發接口供前端調用,接口所在應用程序(服務)在服務器上跑。
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':'簽到成功'})
到此,以上web系統所開發的接口及測試都已完成。