说明:下文中的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
若发现未经授权转载者,一律举报。毕竟原创不易,感谢您对知识的认可和理解。
注意:未经作者同意不得二次转载。