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

2024-05-15 15:31:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在Python中使用基于WSDL-SOAP的web服务。我已经看过Dive Into Python代码,但是SOAPpy模块在Python 2.5下不工作。

我试过使用suds,它可以部分工作,但会中断某些类型(suds.Type not found:Type notfound:'item')。

我还查看了Client,但这似乎不支持WSDL。

我看过ZSI但是看起来很复杂。有人有它的样本代码吗?

WSDL是https://ws.pingdom.com/soap/PingdomAPI.wsdl,可以与PHP 5 SOAP客户端一起正常工作。


Tags: 模块代码web类型typenotitemsoap
3条回答

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

所需的基本组成代码块

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

  1. 会话请求部分:请求与提供程序的会话
  2. 会话身份验证部分:向提供程序提供凭据
  3. 客户端部分:创建客户端
  4. Security Header部分:将WS-Security头添加到客户端
  5. 使用部分:根据需要使用可用的操作(或方法)
    1. 您需要哪些模块?

      许多人建议使用诸如urllib2之类的Python模块;但是,至少没有一个模块可以用于这个特定的项目。

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

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

      另外,您需要分别从以下链接下载并安装requests和sud_requests模块(免责声明:我是新来的,所以我现在不能发布多个链接)。

      pypi.python.org/pypi/requests

      pypi.python.org/pypi/suds_requests/0.1

      一旦您成功下载并安装了这些模块,就可以开始了。

      代码

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

      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
            },
       })
      

我建议你看看SUDS

“Suds是一个用于消费Web服务的轻量级SOAP python客户端。”

有一个相对较新的库是非常有前途的,虽然仍然没有很好的文档,似乎非常干净和Python:python zeep

另请参见this answer以获取示例。

相关问题 更多 >