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


相关推荐

  • python中替换字符串中字符_python替换字符串中的某个字符

    python中替换字符串中字符_python替换字符串中的某个字符python_split_strip_replace使用方法使用python时会经常要对字符串做一些处理,比如:分割字符串、去掉空格、替换字符串中的某个字符等,下面介绍下这几个功能的使用。一、Split()作用:将字符串分割成为列表,不改变字符串原始值这里以x为分割符,将a分成了含有三个元素的列表并输出。但不…文章科技小先锋2017-11-15911浏览量正则表达式简介…

    2022年6月7日
    39
  • Spring的静态代理与动态代理[通俗易懂]

    Spring的静态代理与动态代理[通俗易懂]简述AOP是可以横向扩展功能的,能够在不修改原来代码的前提下实现功能扩展,AOP的实现原理即是动态代理+反射。为什么要使用代理1.什么是代理  代理即是将被代理对象进一步封装后,隐藏被代理对象,在不修改被代理对象代码的前提下完成一些额外的处理。2.场景描述  有一个BookService类,其中有一个add方法,现在想在执行hello方法之前打印一句话,例如是打印”…

    2022年10月17日
    0
  • 接口测试之Postman使用全指南(原来使用 Postman测试API接口如此简单)

    接口测试之Postman使用全指南(原来使用 Postman测试API接口如此简单)Postman是一个可扩展的API开发和测试协同平台工具,可以快速集成到CI/CD管道中。旨在简化测试和开发中的API工作流,如:使用Newman运行Postman集合Postman工具有Chrome扩展和独立客户端,推荐安装独立客户端。Postman有个Workspace的概念,workspace分personal和team类型。Personalworkspace只能自己查看。

    2022年5月31日
    78
  • acwing-278数字组合(0-1背包)[通俗易懂]

    acwing-278数字组合(0-1背包)[通俗易懂]原题链接给定 N 个正整数 A1,A2,…,AN,从中选出若干个数,使它们的和为 M,求有多少种选择方案。输入格式第一行包含两个整数 N 和 M。第二行包含 N 个整数,表示 A1,A2,…,AN。输出格式包含一个整数,表示可选方案数。数据范围1≤N≤100,1≤M≤10000,1≤Ai≤1000输入样例:4 41 1 2 2输出样例:3#include<bits/stdc++.h>using namespace std;const int M = 1e4

    2022年8月9日
    3
  • android之Widget开发详解实例二

    下面是本篇的大纲:1、AppWidget 框架类2、AppWidget 框架的主要类介绍3、DEMO 讲解1、AppWidget 框架类1、AppWidgetProvider :继承自 BroadcastRecevier , 在AppWidget 应用 update、enable、disable 和 delete 时接收通知。其中,onUpdate、onRece

    2022年3月10日
    45
  • poj 3613 Cow Relays

    poj 3613 Cow Relays

    2022年2月4日
    36

发表回复

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

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