【问题标题】:Changing web service url in SUDS library更改 SUDS 库中的 Web 服务 URL
【发布时间】:2009-11-03 22:31:35
【问题描述】:

使用 SUDS SOAP 客户端如何指定 Web 服务 URL。我可以清楚地看到客户端构造函数中指定了 WSDL 路径,但是如果我不想更改 Web 服务 url 怎么办?

【问题讨论】:

    标签: python soap suds


    【解决方案1】:

    Suds 支持WSDL with multiple services or multiple ports(或两者都支持),并且没有关于您正在使用什么的任何详细信息,我只是猜测这就是您正在寻找的。如果您提供更多详细信息,例如您的 Client 实例的外观,这个问题会更容易回答。

    成功构建Client后,您可以print查看可用的服务、方法、端口和类型。

    以下示例直接来自 suds 文档。

    来自 suds 网站的示例:

    from suds.client import Client
    url = 'http://www.thomas-bayer.com/axis2/services/BLZService?wsdl'
    client = Client(url) 
    print client
    

    输出这个:

    Suds - version: 0.3.7 build: (beta) R550-20090820
    
    Service (BLZService) tns="http://thomas-bayer.com/blz/"
       Prefixes (1)
         ns0 = "http://thomas-bayer.com/blz/"
       Ports (2):
         (soap)
           Methods (1):
             getBank(xs:string blz, )
         (soap12)
           Methods (1):
             getBank(xs:string blz, )
       Types (5):
          getBankType
          getBankResponseType
          getBankType
          getBankResponseType
          detailsType
    
    Service (OtherBLZService) tns="http://thomas-bayer.com/blz/"
       Prefixes (1)
         ns0 = "http://thomas-bayer.com/blz/"
       Ports (2):
         (soap)
           Methods (1):
             getBank(xs:string blz, )
         (soap12)
           Methods (1):
             getBank(xs:string blz, )
       Types (5):
          getBankType
          getBankResponseType
          getBankType
          getBankResponseType
          detailsType
    

    可以通过多种方式访问​​每个服务,但这里有一个与方法限定的每个服务不同的端口:

    ## service: BLZService, port: soap12, method: getBank
    client.service['BLZService']['soap12'].getBank()
    ## service: OtherBLZService, port: soap, method: getBank
    client.service['OtherBLZService']['soap'].getBank()
    

    这就是你正在使用的那种东西吗?如果是这样,请访问他们的文档,我认为您会发现这些文档已经足够了。如果没有,请考虑在您的问题中添加尽可能多的细节,以便为我们提供更多帮助!

    【讨论】:

    • 其实我问的是如何在运行时修改端点(端口)地址。你的回答提醒了我这个配置可以在服务描述中。它实际上就在那里。 client.service['BLZService'].setlocation()
    • 太棒了,我真的很高兴能帮到你。恭喜! :)
    • 使用 suds 0.4 这是 client.wsdl.services[0].setlocation(new_url)
    【解决方案2】:

    您可以通过两种方法将客户端指向不同的端点:

    1) client.set_options(location='http://path/to/your/wsdl') - 或 - 2) 使用客户端的 clone() 方法。然后再次使用 set_options() 。它实际上与上面的 #1 相同,但您最终会使用两个客户端,而不是一个。

    后一种方法是创建客户端对象的轻量级克隆的一种干净的方法 - 它们将共享已解析的 wsdl,并且仅在您通过 set_options() 设置的选项上有所不同。

    这两种方法我都用过,而且效果都很好。

    -马特

    【讨论】:

      【解决方案3】:

      我认为您必须为每个不同的 URL 创建一个新的 Client 对象。

      【讨论】:

      • 但我将 WSDL url 传递给客户端构造函数。如果 WSDL 和服务有不同的 URL 怎么办?
      • WSDL 应该包含服务 URL 的所有细节。每个 wsdl 只需要一个客户端对象,您不必担心服务 url(作为客户端)
      猜你喜欢
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 2018-12-15
      相关资源
      最近更新 更多