当前位置:  开发笔记 > 编程语言 > 正文

如何在Python中使用WSDL(SOAP)Web服务?

如何解决《如何在Python中使用WSDL(SOAP)Web服务?》经验,为你挑选了6个好方法。

我想在Python中使用基于WSDL SOAP的Web服务.我查看了Dive Into Python代码,但SOAPpy模块在Python 2.5下不起作用.

我已经尝试使用肥皂水其中工程部分,但与某些类型的中断(suds.TypeNotFound:类型未找到:"项目").

我也看过Client,但这似乎不支持WSDL.

我看过ZSI,但看起来很复杂.有没有人有任何示例代码?

WSDL是https://ws.pingdom.com/soap/PingdomAPI.wsdl,可以与PHP 5 SOAP客户端一起使用.



1> Yusufk..:

我建议你看看SUDS

"Suds是一个用于使用Web服务的轻量级SOAP python客户端."


使用递归导入打开WSDL时,Suds具有无限递归问题.这被Suds认为是一个阻塞错误,这个问题是在3年前创建的,但尚未修复.https://fedorahosted.org/suds/ticket/239这让我想知道Suds是否适合在2012年使用?
这是最好的答案,但是如果有人在寻找今天可以使用的答案,请考虑[Zeep](https://python-zeep.readthedocs.io/en/master/),因为最新的答案也是如此。
[suds](https://pypi.python.org/pypi/suds)似乎已经死了.万岁[SUDS](https://github.com/heroku/sf-suds/tree/master/suds) - 这似乎是活跃的福克.

2> Teddy Belay..:

我最近偶然发现了同样的问题.以下是我的解决方案的概要:

需要基本组成代码块

以下是客户端应用程序所需的基本代码块

    会话请求部分:请求与提供者的会话

    会话身份验证部分:向提供者提供凭据

    客户端部分:创建客户端

    安全标题部分:将WS-Security标头添加到客户端

    消费部分:根据需要消耗可用的操作(或方法)

你需要什么模块?

许多人建议使用像urllib2这样的Python模块; 但是,没有一个模块可以工作 - 至少对于这个特定项目而言.

所以,这是您需要获得的模块列表.首先,您需要从以下链接下载并安装最新版本的suds:

pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2

此外,你需要下载并安装分别从下面的链接请求,并suds_requests模块(声明:我是新在这里发布,所以我不能发布多个链接现在).

pypi.python.org/pypi/requests

pypi.python.org/pypi/suds_requests/0.1

成功下载并安装这些模块后,您就可以开始使用了.

代码

按照前面概述的步骤,代码如下所示:Imports:

import logging
from suds.client import Client
from suds.wsse import *
from datetime import timedelta,date,datetime,tzinfo
import requests
from requests.auth import HTTPBasicAuth
import suds_requests

会话请求和身份验证:

username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)

创建客户端:

client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))

添加WS-Security标头:

...
addSecurityHeader(client,username,password)
....

def addSecurityHeader(client,username,password):
    security=Security()
    userNameToken=UsernameToken(username,password)
    timeStampToken=Timestamp(validity=600)
    security.tokens.append(userNameToken)
    security.tokens.append(timeStampToken)
    client.set_options(wsse=security)

请注意,此方法会创建图1中所示的安全标头.因此,您的实现可能会有所不同,具体取决于您正在使用的服务所有者提供的正确的安全标头格式.

采用相关方法(或操作):

result=client.service.methodName(Inputs)

记录:

这种实现中的最佳实践之一就是记录通信的执行方式.如果出现问题,可以轻松调试.以下代码执行基本日志记录.但是,除了代码中描述的方面之外,您还可以记录通信的许多方面.

logging.basicConfig(level=logging.INFO) 
logging.getLogger('suds.client').setLevel(logging.DEBUG) 
logging.getLogger('suds.transport').setLevel(logging.DEBUG)

结果:

这是我的结果.请注意,服务器返回HTTP 200.这是HTTP请求 - 响应的标准成功代码.

(200, (collectionNodeLmp){
   timestamp = 2014-12-03 00:00:00-05:00
   nodeLmp[] = 
      (nodeLmp){
         pnodeId = 35010357
         name = "YADKIN"
         mccValue = -0.19
         mlcValue = -0.13
         price = 36.46
         type = "500 KV"
         timestamp = 2014-12-03 01:00:00-05:00
         errorCodeId = 0
      },
      (nodeLmp){
         pnodeId = 33138769
         name = "ZION 1"
         mccValue = -0.18
         mlcValue = -1.86
         price = 34.75
         type = "Aggregate"
         timestamp = 2014-12-03 01:00:00-05:00
         errorCodeId = 0
      },
 })



3> lorenzog..:

有一个相对较新的图书馆,非常有前途,虽然仍然记录很差,似乎非常干净和pythonic:python zeep.

有关示例,请参阅此答案.



4> Matthew Scou..:

现在(截至2008年),所有可用于Python的SOAP库都很糟糕.我建议尽可能避免使用SOAP.我们最后一次被迫使用Python的SOAP Web服务时,我们在C#中编写了一个包装器,它在一侧处理SOAP并将COM传递给另一方.


@ddaa - SOAP是很多东西,但"简单"不是其中之一.
这听起来像是使用基于xml和http的简单协议的一种非常复杂的方式.

5> 小智..:

我会定期寻找一个满意的答案,但到目前为止还没有运气.我使用soapUI +请求+手工劳动.

我最后一次要这样做时放弃并使用了Java ,并且在我上次要这样做的时候放弃了几次,但这并不重要.

去年使用Project Place的RESTful API成功使用了请求库后,我想到也许我可以用类似的方式手动滚动我想要发送的SOAP请求.

原来,不是太困难,但它耗时且容易出错,尤其是如果字段不一致的命名(就是我目前工作的今天"的jobId"的JobId"和'作业ID’.我用的soapUI加载WSDL使得更容易提取端点等并执行一些手动测试.到目前为止,我很幸运没有受到我正在使用的任何WSDL的更改的影响.



6> 小智..:

Zeep是一个适合Python的不错的SOAP库,它可以满足您的要求:http : //docs.python-zeep.org

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有