【问题标题】:python unable to access suds methodspython无法访问suds方法
【发布时间】:2012-07-28 19:40:04
【问题描述】:

我正在尝试在 python 中使用 SUDS 访问 SOAP api

from suds.client import Client
def initialize():
    url = 'http://uuuuuuuuuuuuuuu.com/wewewe/WsNBI?wsdl'
    username = 'xxxxx'
    password = 'ppppppp'
    client = Client(url)
    print client
    result = client.service.Login(nbiLogin NBILogin(username,password),)
    print result

我无法调用 Login 方法,知道我该怎么做吗?

这些是查询返回的方法...

Suds ( https://fedorahosted.org/suds/ )  version: 0.4 GA  build: R699-20100913

Service ( WsNBIService ) tns="www.test.com"
   Prefixes (1)
      ns0 = "www.test.com"
   Ports (1):
      (WsNBIPort)
         Methods (5):
            GetClientAssociationInfo(nbiSession NBISession, clientAssociationReqData ClientAssociationReqData, )
            GetEvent(nbiSession NBISession, eventReqData EventReqData, )
            GetZDClientAssociationInfo(nbiSession NBISession, clientAssociationReqData ClientAssociationReqData, )
            Login(nbiLogin NBILogin, )
            Logout(nbiSession NBISession, )
         Types (22):
            GetClientAssociationInfo
            GetClientAssociationInfoResponse
            GetEvent
            GetEventResponse
            GetZDClientAssociationInfo
            GetZDClientAssociationInfoResponse
            Login
            LoginResponse
            Logout
            LogoutResponse
            authenticateResult
            clientAssociationDetail
            clientAssociationReqData
            clientAssociationResult
            eventDetail
            eventReqData
            eventResult
            eventType
            nbiLogin
            nbiResult
            nbiSession
            requestType

更新:

#!/usr/bin/env python

from suds.client import Client

def initialize():
    url = 'http://xxxxxxx/xxxx/WsNBI?wsdl'
    username = 'xxxxx'
    password = 'pppppp'
    client = Client(url)
    login = client.factory.create("ns0:NBILogin")
    print login
    ws = login.nbiLogin(userName=username, password = password)
    result = client.service.Login(ws)
    print result
def main():
    initialize()

if __name__ == "__main__":
    main()


[root@server scripts]# ./flex_soap.py
(nbiLogin){
   UserName = None
   Password = None
 }
Traceback (most recent call last):
  File "./flex_soap.py", line 19, in ?
    main()
  File "./flex_soap.py", line 16, in main
    flexMaster()
  File "./flex_soap.py", line 12, in flexMaster
    ws = login.nbiLogin(userName=username, password = password)
AttributeError: nbiLogin instance has no attribute 'nbiLogin'

更新:

#!/usr/bin/env python

from suds.client import Client

def initialize():
    url = 'http://xxxxx/intune/WsNBI?wsdl'
    username = 'uuuuu'
    password = 'pppp'
    client = Client(url)
    print client
    login = client.factory.create("ns0:NBILogin")
    print login
    login.UserName = username
    login.Password = password
    result = client.service.Login(login)
    print result
    event = client.factory.create("ns0:EventReqData")
    print event
def main():
    initialize()

if __name__ == "__main__":
    main()

[root@server scripts]# ./flex_soap.py

(nbiLogin){
   UserName = None
   Password = None
 }
(authenticateResult){
   Success = True
   Session =
      (nbiSession){
         Id = "0eda1622-473c-4dd6-b68e-4ff3c1ee27f6"
      }
 }
(eventReqData){
   EventType =
      (eventType){
         value = None
      }
   SerialNumbers =
      (SerialNumbers){
         SerialNumber[] = <empty>
      }
 }

知道如何获得此方法

GetEvent(nbiSession NBISession, eventReqData EventReqData, )

【问题讨论】:

    标签: python linux api soap suds


    【解决方案1】:

    您的代码不是有效的 Python。 Login(nbiLogin NBILogin, ) 表示有一个方法Login 接受NBILogin 类型的单个参数。这不是您应该使用的文字语法。试试这样的:

     login = client.factory.create("ns0:NBILogin")
     login.UserName = username 
     login.Password = password 
     result = client.service.Login(login)
    

    这个输出:

    (authenticateResult){
       Success = True
       Session =
          (nbiSession){
             Id = "0eda1622-473c-4dd6-b68e-4ff3c1ee27f6"
          }
     }
    

    表示result.Success == True and result.Session.Id == "0eda1622-473c-4dd6-b68e-4ff3c1ee27f6"

    GetEvent(nbiSession NBISession, eventReqData EventReqData, ) 表示您需要NBISessionEventReqData 类型的2 个参数。

    您可以从result 获得的会话。构建EventReqData

    (eventReqData){
       EventType =
          (eventType){
             value = None
          }
       SerialNumbers =
          (SerialNumbers){
             SerialNumber[] = <empty>
          }
     }
    

    你需要创建EventTypeSerialNumbers

    event_req_data = client.factory.create("ns0:EventReqData")
    event_req_data.EventType = "put some appropriate event type here"
    event_req_data.SerialNumbers = [10, 51, 1] # some serial numbers 
    

    以上假设序列号是整数,否则创建每个 SerialNumber 的方式与通过 client.factory.create() 的所有其他对象相同:

    sns = event_req_data.SerialNumbers = client.factory.create('ns0:SerialNumbers')
    for item in [10, 51, 1]:
        ns = client.factory.create('ns0:SerialNumber')
        ns.value = item
        sns.SerialNumber.append(ns)
    

    我在列表中没有看到 SerialNumbersSerialNumber 类型,因此它可能会失败。

    如果 suds 不能自行从字符串转换为 EventType,那么您可以使用 client.factory.create() 显式创建 EventType

    event_type = client.factory.create("ns0:EventType")
    event_type.value = "put some appropriate event type here"
    event_req_data.EventType = event_type
    

    拨打电话:

    event = client.service.GetEvent(login.Session, event_req_data)
    

    【讨论】:

    • 感谢塞巴斯蒂安,我得到了一些输出,它现在说“nbiLogin 实例没有属性'nbiLogin'”,对不起,我是soap API 的新手......我还打印了如何填充nbiLogin .. .有什么想法吗?
    • @krisdigitx:我已经更新了答案以考虑来自print login 的信息。
    • 感谢 sebastian,现在我想访问其他方法 r "GetEvent(nbiSession NBISession, eventReqData EventReqData, )" 有什么想法吗?谢谢你,真的很感激......我已经附上了更新的输出......
    • 嘿塞巴斯蒂安,非常感谢我的帮助,我现在可以从 API 获取所有事件...
    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2015-05-25
    • 2013-05-03
    相关资源
    最近更新 更多