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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java中WebService实例

    Java中WebService实例WebServices是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务。WebService的关键技术和规则:1.XML:描述数据的标准方法.2.SOAP:表示信息交换的协议(简单对象访问协议).3.WSDL:Web服务描述语言.4.UDDI:通用描述、发现与集成,他是一种独立于平台,基于XML语言的用于在互联网上描述商务的协议。一、利用JDKweb服务api实现,这里使用基于SOAPmessage的WebService:1.首先创

    2022年7月21日
    10
  • 改变传统思维,抢占世界“汽车产业”制高点

    改变传统思维,抢占世界“汽车产业”制高点

    2022年3月13日
    47
  • 虚拟机ifconfig或ip addr不显示ip地址「建议收藏」

    虚拟机ifconfig或ip addr不显示ip地址「建议收藏」虚拟机ifconfig或ipaddr不显示ip地址报错图片:一直查不到ip地址,有重新启动很多次解决方法(1)命令查看配置文件:vi/etc/sysconfig/network-scripts/ifcfg-ens33ens33注意看这个修改的文件后缀把ONBOOT的状态no改为yes然后重启,应该就没问题了。(2):还有一种可能是因为虚拟网卡没有正常连接,解决方法是开启虚拟网卡的服务:打开任务管理器,选择服务标签,为了保险,开启所有的和vmware有关的服务检

    2022年7月27日
    8
  • spring容器初始化过程总结_java构造方法初始化

    spring容器初始化过程总结_java构造方法初始化前言我们知道,spring的启动其实就是容器的启动,而一般情况下,容器指的其实就是上下文ApplicationContext。AbstractApplicationContext作为整个A

    2022年8月16日
    6
  • npm 模块 移除_【已解决】npm卸载模块后该模块并没有从package.json中去掉[通俗易懂]

    折腾:期间,遇到一个奇怪的现象:用npmremovexxx或npmuninstallxxx后xxx并没有从package.json中去掉:➜HeadquarterReportgit:(permission-control)✗npmremoveelement-ui–async-validator@1.6.9node_modules/async-validator–babe…

    2022年4月10日
    70
  • 树莓派的产品定位,以及探讨与ARM开发板的区别

    树莓派的产品定位,以及探讨与ARM开发板的区别目录一、树莓派的几点认识二、树莓派的定位,与ARM开发板有不同的目标用户三、树莓派与嵌入式开发的区别1、树莓派能不能做为嵌入式的ARM开发板?2、树莓派能不能进行嵌入式开发与学习?四、树莓派上的实践一、树莓派的几点认识1、树莓派是一款基于Linux系统的单板机电脑。它由英国的树莓派基金会所开发,目的是以低价硬件及自由软件刺激在学校的基本的计算机科学教育。树莓…

    2022年6月9日
    29

发表回复

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

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