python调用webservice

python调用webservice的两种方法

    • suds调用
    • requests调用

因为工作关系,长期对接各种三方的接口(视图,webservice,队列)。期间遇见了各种报错,也查阅了许多资料,特此记录webservice对接领域长期以来积累的经验,展示两种webservice对接的方式,以及异常排查的思路,一般能解决大部分wsdl符合要求的接口。


suds调用

suds是python的一个轻量型python拓展包,它可以快速的解析wsdl文件,结构化的返回接口的方法,调用方式及入参类型。

  • suds快速生成webservice的client调用
import suds
from suds.client import Client
url = "http://localhost/method?wsdl" #注意入参url为接口的wsdl地址
client = Client(url)
#输出接口的结构化描述
print client
----------------------------------
#调用接口方法,非常简单
result = client.service.dosomething('2019-01-01','2019-01-02')
print result

返回的client结构化描述如下图,methods类里即为接口的方法,入参方式,以及入参类型。
python调用webservice_第1张图片

  • 有的接口入参形式是自定义格式,比如嵌套类型的字典,这时我们可以通过suds工厂来创建特殊入参类型
Input = client.factory.create('SomeNme')
Input.name = 'xxx'
Input.sex = 'xxx'
Input.date = datetime.now().strftime("%Y-%m-%d")
result=client.service.dosomething(Mheader)
  • 异常排查。通常建议开启日志,查看调用过程种传输的信息

1.查看调用过程中发生的soap报文和接收到的soap报文:

print client.last_sent() #发送
print client.last_received() #接收

2.调用失败时通常只有last_sent(),received多接收到none,此时可查看传输中的日志,输出到终端:

import sys
logger = logging.getLogger('suds.transport.http')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler(sys.stdout))

3.查看整个调用过程中的日志信息,以排查解析xml时的not type错:

import sys
import logging
logger = logging.getLogger('suds')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler(sys.stdout))

4.异常捕捉

try:
    client.service.xxx_func(*args, **kwargs)
except suds.WebFault,ex:
    print ex.fault        
    print ex.document

学习自:https://www.cnblogs.com/Tommy-Yu/p/5567091.html


requests调用

webservice通常的请求过程都是通过客户端向服务端发送soap数据包,以得到服务端发回的数据包在解析。所以此过程通常可以使用http的post请求来模拟。不会看wsdl也没关系,可以requests和soapui配合使用。
此方法可以针对于没有看过suds源码,以及使用suds调用接口时异常报错,查询stackoverflow也无法找到答案的情况

  • 核心代码为:
import requets
response = requests.post(self.url, headers=self.headers, data=send_data, verify=False)
#返回结果为
result = response.content

headers和data都可以通过suds的日志,或通过soapui模拟得到
python调用webservice_第2张图片

你可能感兴趣的:(日常积累,操作记录)