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


相关推荐

  • 可靠性测试的基础知识——可靠性的计算方法

    可靠性测试的基础知识——可靠性的计算方法计算机系统的可靠性从它开始运行(t=0)到某时刻t这段时间内能正常运行的概率,用R(t)表示。失效率指单位时间内失效的元件数与元件总数的比例,以λ表示,当λ为常数时,可靠性与失效率的关系为:R

    2022年7月4日
    27
  • sql修改字段长度「建议收藏」

    sql修改字段长度「建议收藏」sql修改字段长度的语法altertable表名modify字段名字段类型;标准sql所有都适用altertable数据库.表名modify字段名字段类型;修改字段名名称altertable数据库名表名columncol1tocol2;添加字段altertable数据库名.表名add字段名类型;…

    2022年5月3日
    1.0K
  • Oracle基础(五)pl/sql进阶(分页过程)

    Oracle基础(五)pl/sql进阶(分页过程)

    2022年1月19日
    37
  • NIFI自定义开发

    NIFI自定义开发NIFI 自定义开发 NIFI 自定义开发组件的结果目标 是能够在 NIFI 主页 Processor 里面拖动出来可以使用自己设置的属性 以及自己操作的逻辑处理 NIFI 自定义组件的开发 其实就是继承 AbstractProc 类 实现其方法即可 下面直接放上一个例子进行说明 以及各对象的使用用途说明 自定义开发组件步骤 1 mavenPOM 文件中引入 nifi 对应包 2 resources 目录下新建文件夹 META INF services3 META INF services 下新建一个 Fileo

    2025年10月24日
    0
  • 递归之原理及汉罗塔的递归与非递归实现[通俗易懂]

    递归之原理及汉罗塔的递归与非递归实现[通俗易懂]递归章节一.什么是递归递归:简单的讲,就是定义一个过程或函数时出现调用本过程或本函数就称为递归。典型的例子:求阶乘:intfun(intn){ if(n==1) return(1);elsereturnfun(n*fun(n-1));}二.那么使用递归需要满足那些条件呢?(1) 从上例就可以看出,递归需要终止递归的结束条件。(2)…

    2022年10月11日
    3
  • javaee学生选课系统源码_学生选课管理系统流程图

    javaee学生选课系统源码_学生选课管理系统流程图基于javaweb的ssm学校教务管理系统(管理员,教师,学生)文章结构一、开发框架及业务方向1.开发环境2.开发框架3.整体业务二、项目结构及页面展示1.项目整体结构2.用户页面3.管理员页面***需要源码的加企鹅:671033846;备注CSDN即可******文章结构一、开发框架及业务方向1.开发环境操作系统不限:java特性,一套代码,导出运行jdk版本不限:推荐jdk1.8tomcat版本不限:推荐Tomcat8.0数据库mysql:版本不限,推荐mysql8.0以下开发工具:e

    2022年10月15日
    3

发表回复

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

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