python开发webservice接口_python2 搭建webservice 服务实践

说明:下文中的ws 默认是webservice的缩写

1.安装库

suds==0.4(python 2客户端调用)

soaplib==2.0.0b2(python2 服务端)

lxml(解析xml)

2.搭建webservice 模板(以下内容来自于网络,并经过测试)

代码:demo.py

# coding: utf-8

import soaplib

from soaplib.core.util.wsgi_wrapper import run_twisted # 发布服务

from soaplib.core.server import wsgi

from soaplib.core.service import DefinitionBase # 所有服务类必须继承该类

from soaplib.core.service import soap # 声明注解

from soaplib.core.model.clazz import Array # 声明要使用的类型

from soaplib.core.model.clazz import ClassModel # 若服务返回类,该返回类必须是该类的子类

from soaplib.core.model.primitive import Integer, String

import sys

reload(sys)

sys.setdefaultencoding('utf8')

class C_ProbeCdrModel(ClassModel):

__namespace__ = "C_ProbeCdrModel"

Name = String

Id = Integer

class HelloWorldService(DefinitionBase): # 这是一个web service

@soap(String, _returns=String) # 声明一个服务,标识方法的参数以及返回值

def say_hello(self, name): # 定义接口方法say_hello,参数name;下同

# 这里是接口的具体的操作,这里根据自己的情况.....

return 'hello %s!' % name

@soap(_returns=Array(String))

def GetCdrArray(self):

L_Result = ["1", "2", "3"]

return L_Result

@soap(_returns=C_ProbeCdrModel)

def GetCdr(self): # 返回的是一个类,该类必须是ClassModel的子类,该类已经在上面定义

L_Model = C_ProbeCdrModel()

L_Model.Name = L_Model.Name

L_Model.Id = L_Model.Id

return L_Model

@soap(Integer,Integer,_returns=String)

def addition(self,a,b):

return str(a)+'+'+str(b)+'='+str(a+b)

if __name__ == '__main__': # 发布服务

try:

from wsgiref.simple_server import make_server

soap_application = soaplib.core.Application([HelloWorldService], 'tns')

wsgi_application = wsgi.Application(soap_application)

server = make_server('localhost', 7789, wsgi_application)

server.serve_forever()

except ImportError:

print 'error'

3.测试

a.运行demo.py

b.调用soapui,刷新接口,发现有若干ws接口,即可正常开始测试

c.编写run.py,验证运行的ws接口

# coding:utf-8

from suds.client import Client

t = Client('http://localhost:7789/SOAP/?wsdl')

t.service.addition(1,2)

这里输出:1+2=3

实践过程中的问题:

1.返回结果并没有输出全部的xml,而是只输出了最后的返回结果,数据类型:suds.sax.text.Text,可以当作unicode 类型使用,可以转换输出。

2.在实际开发校验的过程中,发现了一些问题:如ws返回json 类型的数据,可能利用json.loads()方法无法正常解析,实际上可能是由于数据里含有异常的字符,导致json.loads无法正常解析,需要将异常字符剔除。

3.有时为避免json解析出现其他转义问题,json.loads()方法加上参数strict=False

附录:

[suds.sax.text.Text文档] (https://jortel.fedorapeople.org/suds/doc/suds.sax.text.Text-class.html)

更多内容,请关注我。

点击链接加入群聊【odoo 学习交流】:正在跳转

qq群:484011580

若发现未经授权转载者,一律举报。毕竟原创不易,感谢您对知识的认可和理解。

注意:未经作者同意不得二次转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值