2013-04-12 105 views
0

我正嘗試使用Python/SUDS連接到Web服務。Python Suds Soap客戶端錯誤

我在單個文件中有以下代碼,並且我能夠成功連接並收到響應。

class Suds_Connect: 
    def __init__(self, url, q_user, q_passwd): 

     logging.basicConfig(level=logging.INFO) 
     logging.getLogger('suds.client').setLevel(logging.DEBUG) 
     try: 
      # fix broken wsdl 
      # add <s:import namespace="http://www.w3.org/2001/XMLSchema"/> to the wsdl 
      imp = Import('http://www.w3.org/2001/XMLSchema', 
      location='http://www.w3.org/2001/XMLSchema.xsd') 

      wsdl_url = url 
      self.client = Client(wsdl_url, doctor=ImportDoctor(imp)) 
      t = HttpAuthenticated() 


      security = Security() 
      token = UsernameToken(q_user,q_passwd) 
      security.tokens.append(token) 
      self.client.set_options(wsse=security) 



     except Exception, e: 
      print "Unexpected error:", sys.exc_info()[0] 
      print str(e) 
      sys.exit() 


def CallWebMethod(): 

     try: 
     print ' SUDS Client' 
      print self.client 
      Person= self.client.factory.create('ns0:Person') 


      Person.name= 'bob' 
      Person.age= '34' 
      Person.address= '44, river lane' 
      print self.client.service.AddPerson(Person) 

     except WebFault, f: 
      print str(f.fault) 
     except Exception, e: 
      print str(e) 

if __name__ == '__main__': 
    errors = 0 
    sudsClient = Suds_Connect('url','user','password') 
    sudsClient.CallWebMethod() 
    print '\nFinished:' 

我想在將從按鈕單擊事件中調用的Python客戶端應用程序中使用此代碼。 我試圖實現這一點,我可以打印出客戶端,但是當我撥打網絡服務電話(print self.client.service.AddPerson(Person))時,出現以下錯誤。

unsupported operand type(s) for +: 'NoneType' and 'str' 

我該如何解決這個錯誤?

回答

0

看起來像webservice調用返回無。需要額外的信息來確定哪裏出了問題。

首先 - 在調用Suds_Connect之前通過添加來啓用泡沫記錄。這應該爲您提供有關泡沫下發生了什麼的信息。

import logging 
logging.basicConfig(level=logging.DEBUG) 

另一件事是嘗試獲得更多的調試信息 - 請儘量不要使用以下的print self.client.service.AddPerson(Person)

result = self.client.service.AddPerson(Person) 
print str(result) 

而且這將有助於獲得完整的堆棧跟蹤異常 - 這行它發生在和什麼是調用堆棧。請嘗試註釋掉except Exception, e:案例的異常處理,並在這裏發佈您將得到的異常。

0

好吧,

這似乎是我遇到的問題涉及肥皂頭一代。 在SUDS中有一個包含函數xml()的文件wsse.py。

def xml(self): 
     """ 
     Get xml representation of the object. 
     @return: The root node. 
     @rtype: L{Element} 
     """ 
    root = Element('UsernameToken', ns=wssens) 
    u = Element('Username', ns=wssens) 
    u.setText(self.username) 
    root.append(u) 
    p = Element('Password', ns=wssens) 
    p.set('Type', "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest") 

    import sha 
    import base64 
    p.setText(base64.encodestring(sha.new(self.nonce + str(UTC(self.created)) + self.password).digest()).replace("\n", '')) 

    root.append(p) 
    if self.nonce is not None: 
     n = Element('Nonce', ns=wssens) 
     n.setText(base64.encodestring(self.nonce).replace("\n",'')) 
     root.append(n) 
    if self.created is not None: 
     n = Element('Created', ns=wsuns) 
     n.setText(str(UTC(self.created))) 
     root.append(n) 
    return root 

我得到了一個錯誤@以下行:

p.setText(base64.encodestring(sha.new(self.nonce + str(UTC(self.created)) + self.password).digest()).replace("\n", '')) 

所以我評論了這條線,並添加以下行:

p.setText(self.password) 

請注意,我在打電話over https

關於

Noel