0

我正在尝试使用 Python/SUDS 连接到 Web 服务。

我在一个文件中有以下代码,我能够成功连接并收到响应。

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 客户端应用程序中使用此代码。我试图实现这一点,并且能够打印出客户端,但是当我进行 Web 服务调用 ( print self.client.service.AddPerson(Person)) 时,出现以下错误。

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

我该如何解决这个错误?

4

2 回答 2

0

好的,

看来我遇到的问题与 Soap Header 生成有关。在 SUDS 中有一个文件 wsse.py,其中包含一个函数 xml()。

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)

请注意,我正在通过 https 拨打电话

问候

诺埃尔

于 2013-04-16T15:27:33.470 回答
0

看起来 web 服务调用返回无。需要额外的信息来确定出了什么问题。

首先 - 通过在调用 Suds_Connect 之前添加来启用 suds 日志记录。这应该为您提供有关引擎盖下的泡沫发生了什么的信息。

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:case 的异常处理,并在此处发布您将得到的异常。

于 2013-04-13T20:14:35.297 回答