博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Python的Webservice开发(二)-如何用Spyne开发Webservice
阅读量:4478 次
发布时间:2019-06-08

本文共 3351 字,大约阅读时间需要 11 分钟。

一、功能需求

本次案例是开发一个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的协议需要用到Soap11from spyne.protocol.soap import Soap11#如果开发传入传出为Json需要用到JsonDocumentfrom spyne.protocol.json import JsonDocument#可以创建一个wsgi服务器,做测试用from spyne.server.wsgi import WsgiApplication#将Spyne创建的app 发布为djangofrom django.views.decorators.csrf import csrf_exempt#创建一个负责数据类型from spyne.model.complex import ComplexModel#引用其他的APPfrom 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
创建ItemData相关属性

创建ItemAPI

#创建APIclass 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.ioapplication = Application([ItemAPIService],    tns='spyne.item.api',    in_protocol=JsonDocument(validator='soft'),    out_protocol=JsonDocument())
#定义DjangoApplicationitem_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.parseimport jsonimport requestsheaders = {
'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),]

 

转载于:https://www.cnblogs.com/Evan-fanfan/p/10325447.html

你可能感兴趣的文章
解决SpringCloud使用Feign跨服调用时header请求头中的信息丢失
查看>>
《CoffeeScript应用开发》学习:第五章 CoffeeScript中的类
查看>>
centos 7.3 快速安装ceph
查看>>
redis
查看>>
POJ 1942 Paths on a Grid(组合数学)
查看>>
Android UI设计规范之常用单位
查看>>
计算机如何实现运算?
查看>>
js: 从setTimeout说事件循环模型
查看>>
IT外企那点儿事(7):做一个优秀的基层
查看>>
lsof作用
查看>>
串的模式匹配算法——“KMP算法”
查看>>
Rq-165-FBI序列
查看>>
Audactiy 和 Sox
查看>>
vue视频学习笔记07
查看>>
【题解】矩形相交面积
查看>>
mac下安装mysqlcient 报错
查看>>
用Python3发送邮件详解
查看>>
UVA 562 Dividing coins
查看>>
UPC2018组队训练赛第十五场
查看>>
Alpha 答辩总结
查看>>