Dav*_*idM 122 python soap web-services
我想在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客户端一起使用.
Yus*_*ufk 49
我建议你看看SUDS
"Suds是一个用于使用Web服务的轻量级SOAP python客户端."
Ted*_*lay 19
我最近偶然发现了同样的问题.以下是我的解决方案的概要:
需要基本组成代码块
以下是客户端应用程序所需的基本代码块
你需要什么模块?
许多人建议使用像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
Run Code Online (Sandbox Code Playgroud)
会话请求和身份验证:
username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)
Run Code Online (Sandbox Code Playgroud)
创建客户端:
client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))
Run Code Online (Sandbox Code Playgroud)
添加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)
Run Code Online (Sandbox Code Playgroud)
请注意,此方法会创建图1中所示的安全标头.因此,您的实现可能会有所不同,具体取决于您正在使用的服务所有者提供的正确的安全标头格式.
采用相关方法(或操作):
result=client.service.methodName(Inputs)
Run Code Online (Sandbox Code Playgroud)
记录:
这种实现中的最佳实践之一就是记录通信的执行方式.如果出现问题,可以轻松调试.以下代码执行基本日志记录.但是,除了代码中描述的方面之外,您还可以记录通信的许多方面.
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)
结果:
这是我的结果.请注意,服务器返回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
},
})
Run Code Online (Sandbox Code Playgroud)
lor*_*zog 19
有一个相对较新的图书馆,非常有前途,虽然仍然记录很差,似乎非常干净和pythonic:python zeep.
有关示例,请参阅此答案.
现在(截至2008年),所有可用于Python的SOAP库都很糟糕.我建议尽可能避免使用SOAP.我们最后一次被迫使用Python的SOAP Web服务时,我们在C#中编写了一个包装器,它在一侧处理SOAP并将COM传递给另一方.
小智 5
我会定期寻找一个满意的答案,但到目前为止还没有运气.我使用soapUI +请求+手工劳动.
我最后一次需要这样做时放弃并使用了Java ,并且在我上次想要这样做的时候放弃了几次,但这并不重要.
去年使用Project Place的RESTful API成功使用了请求库后,我想到也许我可以用类似的方式手动滚动我想要发送的SOAP请求.
原来,不是太困难,但它是耗时且容易出错,尤其是如果字段不一致的命名(就是我目前工作的今天"的jobId"的JobId"和'作业ID’.我用的soapUI加载WSDL使得更容易提取端点等并执行一些手动测试.到目前为止,我很幸运没有受到我正在使用的任何WSDL的更改的影响.
| 归档时间: |
|
| 查看次数: |
178351 次 |
| 最近记录: |