python suds_python suds 一坑

python suds_python suds 一坑当被调用服务的返回xml内容值不是按照wsdl文件描述定义的,就莫名奇妙返回suds.WebFault没有更多详细信息!于是将源码解压,并插入到sys.path[0],通过设置断点的方式找出非标准的返回报文到底在说啥。从而调整对应参数。suds-0.4/suds/bindings/binding.py(246~268)defget_fault(self,reply):”””Extract…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203988.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 论概率:从局部随机性到整体确定性

    论概率:从局部随机性到整体确定性概率论与数理统计概率计算三原则学概率论拼的不是数学,而是语文能力独立性条件概率与贝叶斯公式全概率公式 概率计算三原则所有概率问题,都基于三个计算法则:加法法则:如果事件A和事件B相互排斥,而事件A有p种产生方式,事件B有q种产生方式,则事件”A或B”有p+q种产生方式。乘法法则:如果事件A和事件B相互独立,且事件A有p种产生方式,事件B有q种产生方式,则事件”A与B”有p*q种产生方式。.

    2022年5月30日
    42
  • uniqueidentifier转换_unique函数哪个版本有

    uniqueidentifier转换_unique函数哪个版本有uniqueidentifier中文含义“唯一的标识符”。uniqueidentifier数据类型是16个字节的二进制值,应具有唯一性,必须与NEWID()函数配合使用。uniqueidentifier数据类型与identity自增不同,不会为插入的新行自动生成新的ID,新值由NEWID()函数指定。NEWID()函数值会生成全球唯一的标识,标识由网卡号和CPU时钟组成,如:6

    2025年10月1日
    8
  • 网页中的兼容性视图设置在哪_找不到兼容性视图设置

    网页中的兼容性视图设置在哪_找不到兼容性视图设置浏览器兼容性视图设置在浏览器右上角的设置里,设置方法如下:方法11、首先,打开电脑,找到电脑桌面上的IE浏览器,并点击打开,打开后,进入任一网页,找到页面右上方的的设置图标,如下图所示,点击。2、点击这个设置图标后,会展开下图所示的选项,请找到下方的F12开发人员工具(L),并点击进入。3、这时候,浏览器下方会出现一个设置框,找到“浏览器模式”选项,点击,然后找到下方的“兼容性视图”勾选并确认,I…

    2025年10月6日
    7
  • java和c对比_c语言数据结构和java数据结构

    java和c对比_c语言数据结构和java数据结构Sun公司推出的Java是面向对象程序设计语言,其适用于Internet应用的开发,称为网络时代重要的语言之一。Java可以用认为是C的衍生语言,与C在大量元以内成分保持相同,例如此法结构、表达式语句、运算符等与C基本一致:但Java更简洁,没有C中冗余以及容易引起异常的功能成分,并且增加了多线程、异常处理、网络编程等方面的支持功能。本文从多角度对Java与C进行对比分析,为C与Jav

    2022年4月18日
    58
  • python中cPickle用法「建议收藏」

    python中cPickle用法「建议收藏」在python中,一般可以使用pickle类来进行python对象的序列化,而cPickle提供了一个更快速简单的接口,如python文档所说的:“cPickle–Afasterpickle”。cPickle可以对任意一种类型的python对象进行序列化操作,比如list,dict,甚至是一个类的对象等。而所谓的序列化,我的粗浅的理解就是为了能够完整的保存并能够完全可逆的恢复。在cPi…

    2022年6月29日
    25
  • 数据库习题及答案5

    数据库习题及答案5模拟测验1一、1 2 3 4 5 6 7 8 9 10A D C c D A C A A C一、选择题(在每个小题四个备选答案中选出一个正确答案,填在题末的括号中)(本大题共10小题,每小题2分,总计20分)()是位于用户与操作系统之间的一层数据管理软件,它属于系统软件,它为用户或应用程序提供访问数据库的方法。数据库在建立、使用和维护时由其统一管理、统一控制。A.DBMSB.DBC.DBSD.DBA下列四项中,不属于SQL2005实用程序的是()。A.对象资源管理器B.查询分析.

    2025年6月9日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号