无法使用 SOAPpy 调用 Web 服务方法

发布于 2024-08-11 20:22:34 字数 1519 浏览 5 评论 0原文

我尝试使用 SOAPpy 调用 Web 服务:

from SOAPpy import SOAPProxy

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

server = SOAPProxy(url);
print server.GetWeatherByPlaceName('Dallas');
print server.GetWeatherByZipCode ('33126');

服务器调用失败:

Traceback (most recent call last):
  File "soap_test.py", line 6, in <module>
    print server.GetWeatherByPlaceName('Dallas');
  File "C:\usr\bin\Python26\lib\site-packages\SOAPpy\Client.py", line 451, in __call__
    return self.__r_call(*args, **kw)
  File "C:\usr\bin\Python26\lib\site-packages\SOAPpy\Client.py", line 473, in __r_call
    self.__hd, self.__ma)
  File "C:\usr\bin\Python26\lib\site-packages\SOAPpy\Client.py", line 387, in __call
    raise p
SOAPpy.Types.faultType: <Fault soap:Client: System.Web.Services.Protocols.SoapException: Server did not recognize the value of HTTP Header SOAPAction: GetWeatherByPlaceName.
   at System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest()
   at System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapServerMessage message)
   at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
   at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response)
   at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing): >

我做错了什么?

I am trying to call a webservice using SOAPpy:

from SOAPpy import SOAPProxy

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

server = SOAPProxy(url);
print server.GetWeatherByPlaceName('Dallas');
print server.GetWeatherByZipCode ('33126');

The server call fails:

Traceback (most recent call last):
  File "soap_test.py", line 6, in <module>
    print server.GetWeatherByPlaceName('Dallas');
  File "C:\usr\bin\Python26\lib\site-packages\SOAPpy\Client.py", line 451, in __call__
    return self.__r_call(*args, **kw)
  File "C:\usr\bin\Python26\lib\site-packages\SOAPpy\Client.py", line 473, in __r_call
    self.__hd, self.__ma)
  File "C:\usr\bin\Python26\lib\site-packages\SOAPpy\Client.py", line 387, in __call
    raise p
SOAPpy.Types.faultType: <Fault soap:Client: System.Web.Services.Protocols.SoapException: Server did not recognize the value of HTTP Header SOAPAction: GetWeatherByPlaceName.
   at System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest()
   at System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapServerMessage message)
   at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
   at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response)
   at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing): >

What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

幸福丶如此 2024-08-18 20:22:34

使用 .NET Web 服务时,您可以向调用添加肥皂操作覆盖。就像下面这样。确认工作代码。

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' )

有人编写了一个 来执行类似的操作。

上述 .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__

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__
究竟谁懂我的在乎 2024-08-18 20:22:34

正如错误消息所述,SOAPpy 不会添加 SOAPAction HTTP 标头。这就是 SOAPpy 不适用于许多服务的原因。尝试 suds,这是一个有效的示例:

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')

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')
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文