大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
当被调用服务的返回xml内容值不是按照wsdl文件描述定义的, 就莫名奇妙返回suds.WebFault
没有更多详细信息!
于是将源码解压,并插入到sys.path[0], 通过设置断点的方式找出非标准的返回报文到底在说啥。从而调整对应参数。
suds-0.4/suds/bindings/binding.py (246~268)
defget_fault(self, reply):”””Extract the fault from the specified soap reply. If I{faults} is True, an
exception is raised. Otherwise, the I{unmarshalled} fault L{Object} is
returned. This method is called when the server raises a I{web fault}.
@param reply: A soap reply message.
@type reply: str
@return: A fault object.
@rtype: tuple ( L{Element}, L{Object} )”””
importpdb
pdb.set_trace()
reply=self.replyfilter(reply)
sax=Parser()
faultroot= sax.parse(string=reply)
soapenv= faultroot.getChild(‘Envelope’)
soapbody= soapenv.getChild(‘Body’)
fault= soapbody.getChild(‘Fault’)
unmarshaller=self.unmarshaller(False)
p=unmarshaller.process(fault)ifself.options().faults:raiseWebFault(p, faultroot)return (faultroot, p.detail)
顺便记录下suds神器的基本用法,方便查阅:
1. 查看服务接口
importsuds
client=suds.client.Client(‘xxxx_webservice_url’)defget_all_methods(client):return [method for method in client.wsdl.services[0].ports[0].methods]
2. 查看某个具体接口的传输参数及类型
defget_method_args(client, method_name):
method=client.wsdl.services[0].ports[0].methods[method_name]
input_params=method.binding.inputreturn input_params.param_defs(method)
3. 调用接口服务
client.service.xxx_function(….)
4. 关于调试
输出之前调用服务接口时发送了什么soap报文,以及收到什么样的soap报文
print ‘last sent:\n’, client.last_sent()print ‘last recv:\n’, client.last_received()
当服务器返回报文格式不规范时(非wsdl中定义的),client.last_received()为None。这个时候显然对联调极为不利。
那就利用suds自身的日志记录看看咯。设定如下:
importsys
import logging
logger= logging.getLogger(‘suds’)
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler(sys.stdout))
如果只关心传输了什么,则可以限定logger为“suds.transport.http“
importsys
logger= logging.getLogger(‘suds.transport.http’)
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler(sys.stdout))
5. 异常的捕捉和输出
try:
client.service.xxx_func(*args, **kwargs)exceptsuds.WebFault,ex:printex.faultprint ex.document
后记:对于第三方库莫名其妙的问题,果断及时拿源码过来剖析(至少debug)
DEMO
来个demo说明如何运用,如下:
>>> importsuds>>> url=’http://www.gpsso.com/webservice/kuaidi/kuaidi.asmx?wsdl’
>>> client =suds.client.Client(url)>>> printget_all_methods(client)
[KuaidiQuery]>>> print get_method_args(client, ‘KuaidiQuery’)
[(Compay,<0x7f6c55bc43d0 name=”Compay” type=”(u’string’, u’http://www.w3.org/2001/XMLSchema’)”>0x7f6c55bc43d0>), (OrderNo, <0x7f6c55bc4450 name=”OrderNo” type=”(u’string’, u’http://www.w3.org/2001/XMLSchema’)”>0x7f6c55bc4450>)]>>> print client.service.KuaidiQuery(Company=’EMS’, OrderNo=’1111′)
(KuaidiQueryResult){
API=(API){
RESULTS= “0”MESSAGE= “接口查询成功”}
}>>> printclient.last_sent()<?xml version=”1.0″ encoding=”UTF-8″?>
1111
>>> printclient.last_received()<?xml version=”1.0″ encoding=”UTF-8″?>
0
接口查询成功
转载请注明本文来源:http://www.cnblogs.com/Tommy-Yu/p/5567091.html
谢谢!
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/203988.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...