Can't call a webservice method using SOAPpy

泄露秘密 提交于 2019-12-01 01:14:57

As error message states, SOAPpy doesn't add SOAPAction HTTP header. That's why SOAPpy won't work for many services. Try suds, here is a working example:

from suds.client import Client

url = 'http://www.webservicex.net/WeatherForecast.asmx?WSDL'
client = Client(url)

print client.service.GetWeatherByPlaceName('Dallas')
print client.service.GetWeatherByZipCode ('33126')

When consuming .NET webservices, you can add a soap action override to the call. Like the following. Confirmed working code.

import SOAPpy

ns = 'http://www.webservicex.net'
url = '%s/WeatherForecast.asmx' % ns

server = SOAPpy.SOAPProxy( url, namespace=ns )
#following is required for .NET
server.config.buildWithNamespacePrefix = 0
#adding the soapaction is required for .NET
print server._sa( '%s/GetWeatherByPlaceName' %ns ).GetWeatherByPlaceName( PlaceName='Dallas' )
print server._sa( '%s/GetWeatherByZipCode' %ns ).GetWeatherByZipCode( ZipCode='33126' )

Someone wrote a class to do something similar.

A modified version of the above wrapper for .Net:

import SOAPpy

class SOAPProxy( SOAPpy.SOAPProxy ):
    """Wrapper class for SOAPpy.SOAPProxy

    Designed so it will prepend the namespace to the action in the
    SOAPAction HTTP headers.
    """

    def __call( self, name, args, kw, ns=None, sa=None, hd=None, ma=None ):
        sa = sa or self.soapaction
        ns = ns or self.namespace
        self.config.buildWithNamespacePrefix = 0

        # Only prepend namespace if no soapaction was given.
        if ns and not sa:
            if ns.endswith( '/' ):
                sa = '%s%s' % ( ns , name )
            else:
                sa = '%s/%s' % ( ns , name )

        #fixup boolean args - .net wants lowercase
        for arg in kw:
            if isinstance( kw[ arg ], types.BooleanType ):
                kw[ arg ] =  SOAPpy.Types.booleanType( kw[ arg ] )


        return SOAPpy.SOAPProxy.__call( self, name, args, kw, ns, sa, hd, ma )

if __name__ == '__main__':
    print __doc__
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!