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

本文共 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

你可能感兴趣的文章
ajax跨域,携带cookie
查看>>
BZOJ 1600: [Usaco2008 Oct]建造栅栏( dp )
查看>>
洛谷 CF937A Olympiad
查看>>
Codeforces Round #445 C. Petya and Catacombs【思维/题意】
查看>>
用MATLAB同时作多幅图
查看>>
python中map的排序以及取出map中取最大最小值
查看>>
ROR 第一章 从零到部署--第一个程序
查看>>
<form>标签
查看>>
vue去掉地址栏# 方法
查看>>
Lambda03 方法引用、类型判断、变量引用
查看>>
was集群下基于接口分布式架构和开发经验谈
查看>>
MySQL学习——MySQL数据库概述与基础
查看>>
ES索引模板
查看>>
HDU2112 HDU Today 最短路+字符串哈希
查看>>
JPanel重绘
查看>>
图片放大器——wpf
查看>>
SCALA STEP BY STEP
查看>>
cocos2d-x学习笔记
查看>>
MySql中的变量定义
查看>>
Ruby数组的操作
查看>>