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

谢谢!

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • oracle <&gt_oracle asm

    oracle <&gt_oracle asm=>是Oracle中调用存储过程的时候,指定参数名进行调用.一般是,某些参数有默认值的时候,你需要跳过某些参数来进行调用。下面是具体的例子。参数的默认值SQL>CREATE

  • Mac使用Boot Camp安装win10(不用U盘)

    Mac使用Boot Camp安装win10(不用U盘)原文在https://bbs.feng.com/forum.php?mod=viewthread&tid=10748184&page=1&mobile=no大概的步骤:1、从微软官网下载win10专业版本iso文件(文件有4.6G,官网白天下载很慢,晚上下载快点);2、使用MacOS自带的BootCamp(新兵训练营?)安装win10,BootCamp安装时会从官网服务器下载支

  • 浅复制,深复制详解下载_复制时如何跳过一部分内容

    浅复制,深复制详解下载_复制时如何跳过一部分内容文章目录浅复制和深复制String类实现浅复制和深复制有关浅复制与深复制的定义为:对类进行复制的时候按位复制,即把一个对象各数据成员的值原样复制到目标对象中。当类中涉及到指针类型数据成员的时候,往往就会产生指针悬挂问题。看以下结构:class A{ public: int* a;};A a1;A b1=a1;b1=a1执行的是浅复制,此时a1.a和b1….

  • 2021最新Java JDK1.8的安装教程

    2021最新Java JDK1.8的安装教程2021最新JavaJDK1.8安装教程(超详细)jdk1.8又称jdk8.0,是目前相对比较稳定的版本,不建议下载最新的jdk版本,因为最新版的jdk不稳定,在Java开发可能会出现各种各样的BUG。一、JDK下载1.官网下载点击官网下载地址找到自己电脑相对应的JDK,点击下载。如果不清楚自己的电脑是32位还是64位,可以找到“此电脑”,点击右键,选择属性,点开后就可以找到自己电脑位数。如图:勾选接受许可协议后点击下载会提示登录ORACLE账户,如果没有就用邮箱注册一个登录后就可以下

  • WEB/HTTP服务器搭建[通俗易懂]

    WEB/HTTP服务器搭建[通俗易懂]HTTP对于软件都有服务和客户,有服务端和客户端服务就是在操作系统运行一个或者多个程序,并为客户端提供相应所需的服务协议就是计算机网络中进行数据交换而建立的规则、标准或约定的集合。只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、时序。1.WEB服务器web服务器一般指网站服务器,他是一个驻留于Internet的一个计算机程序,用于向浏览器提供文档…

  • Mac 长按键盘快速输入(长按输入慢的问题)

    Mac 长按键盘快速输入(长按输入慢的问题)

发表回复

您的电子邮箱地址不会被公开。

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