一、功能需求
本次案例是開發一個Item的新建的WebService。IN&OUT的類型JsonDocument。
通過傳入相關的參數創建Item,且相關的參數可以被缺省。
二、Spyne的安裝
pip install spyne
對於Python3
pip install spyne==2.13.4a1
三、實現代碼
引入類
from spyne import Application,rpc,ServiceBase,Iterable,Integer,Unicode #如果支持soap的協議需要用到Soap11 from spyne.protocol.soap import Soap11 #如果開發傳入傳出為Json需要用到JsonDocument from spyne.protocol.json import JsonDocument #可以創建一個wsgi服務器,做測試用 from spyne.server.wsgi import WsgiApplication #將Spyne創建的app 發布為django from django.views.decorators.csrf import csrf_exempt #創建一個負責數據類型 from spyne.model.complex import ComplexModel #引用其他的APP from ItemAPI import APP_Item
創建ItemData的相關屬性

class ItemData(ComplexModel): __namespace__ = 'itemData' ItemCode=Unicode SearchCode=Unicode ItemName=Unicode Assortment=Unicode Brand=Unicode Material=Unicode ItemSource=Unicode Category=Unicode Series=Unicode Model=Unicode CostType=Unicode WareHouse=Unicode WareHouseLocation=Unicode Width=Unicode Length=Unicode Height=Unicode Volume=Unicode Size=Unicode GLAccountCost=Unicode GLAccountRevenue=Unicode GLAccountDistribution=Unicode SalesPrice=Unicode CostPrice=Unicode VatCode=Unicode IsHarbin=Unicode IsBatchItem=Unicode CountryCode=Unicode
創建ItemAPI
#創建API class ItemAPIService(ServiceBase): #傳入參數ItemData,由之前定義的 @rpc(ItemData, _returns=Iterable(Unicode)) def item_api(ctx,itemData): fieldList=['ItemCode','SearchCode','ItemName','Assortment','Brand','Material','ItemSource','Category','Series','Model','CostType','WareHouse','WareHouseLocation','Width','Length','Height','Volume','Size','GLAccountCost','GLAccountRevenue','GLAccountDistribution','SalesPrice','CostPrice','VatCode','IsHarbin','IsBatchItem','CountryCode'] dict_Data={} #itemData 會默認將未傳值的根據順序賦Null for field,value in zip(fieldList,itemData): if value is not None: dict_Data[field]=value #yield f"{field}={value}" #返回運行結果 yield APP_Item(dict_Data) #定義API的輸入輸出類型,如果需要支持Soap可以參考網頁http://spyne.io application = Application([ItemAPIService], tns='spyne.item.api', in_protocol=JsonDocument(validator='soft'), out_protocol=JsonDocument() )
#定義DjangoApplication item_app = csrf_exempt(DjangoApplication(application))
if __name__ == '__main__': # You can use any Wsgi server. Here, we chose # Python's built-in wsgi server but you're not # supposed to use it in production. from wsgiref.simple_server import make_server wsgi_app = WsgiApplication(application) server = make_server('0.0.0.0', 8000, wsgi_app) server.serve_forever()
四、對接口進行測試
import http.client,urllib.parse import json import requests headers = {'Content-Type': 'application/json'} requrl = f"http://127.0.0.1:8000/" dict_Data={} dict_Data["ItemCode"]="M09HLE220200030000" dict_Data["ItemName"]="測試" dict_Data["WareHouse"]="2001" dict_Data["CountryCode"]="CN" dict_Data["CostType"]="M-17XAC02-240" dict_Data["Series"]="111" #item_api是spyne的function名,itemData是傳入參數名 postdata=json.dumps({"item_api": {"itemData":dict_Data}}) print(postdata) req = requests.post(requrl,data=postdata) print(json.loads(req.text))
四、Django配置
之前的spyne的app位於view.py中
from . import view #item_app是view中定義的django應用名 urlpatterns = [ url(r'^WebAPI/',view.item_app),]