访问Web服务

时间:2011-04-02 16:30:28

标签: python web-services soap suds

我一直在尝试编写一个客户端来访问Web服务以进行工作。我已经使用Python成功编写了使用SUDS和ZSI的客户端。我使用NetBeans 6.9来帮助编写一些Java客户端。成功的客户都在访问我在互联网上找到的免费网络服务。

我需要连接到工作的客户端并不是那么友好。它确实需要身份验证:

http://www.cmicdataservices.com/datacenter/service.asmx

如果我抓住这个Web服务的WSDL描述,我看到有六种方法。

Methods (6):
    CheckIfAuthorized()
    DataProcessed()
    GetCurrentDataVer1()
    GetID()
    LogDSCStatus(xs:string _clientname, xs:string _status, xs:string _errormsg)
    ResetNewDataReferences()

还返回了70种类型。其中一个是身份验证类型。

在我的Python和Java客户端中,我已经能够创建这些身份验证对象,但却无法继续做任何事情。

从WSDL中我没有迹象表明有任何方法可以使用可用的东西创建这些身份验证对象。 Web服务的供应商确实提供了使用Adobe Air构建的客户端,我可以使用它进行测试,以确保我可以对Web服务进行身份验证并使用它。

这是我第一次不得不与网络服务接口,我不确定这里是否有任何遗漏。任何人都可以告诉我,如果有关于如何使用此服务进行身份验证的话,我是否有明显的遗漏?

这是我写的Python客户端加上它的输出。如果取消注释打印客户端行,则可以看到WSDL信息的良好打印输出。

#!/usr/bin/python

from suds.client import Client

url='http://www.cmicdataservices.com/datacenter/service.asmx?wsdl'
client = Client(url)


#print client
print client.service.CheckIfAuthorized()

输出:

Traceback (most recent call last):
  File "CMICTest.py", line 23, in <module>
    print client.service.CheckIfAuthorized()
  File "/usr/local/lib/python2.6/dist-packages/suds-0.4-py2.6.egg  /suds/client.py",      line 542, in __call__
 return client.invoke(args, kwargs)
  File "/usr/local/lib/python2.6/dist-packages/suds-0.4-py2.6.egg/suds/client.py",  line 602, in invoke
  result = self.send(soapenv)
  File "/usr/local/lib/python2.6/dist-packages/suds-0.4-py2.6.egg/suds/client.py",  line 649, in send
  result = self.failed(binding, e)
  File "/usr/local/lib/python2.6/dist-packages/suds-0.4-py2.6.egg/suds/client.py",  line 702, in failed
  r, p = binding.get_fault(reply)
 File "/usr/local/lib/python2.6/dist-packages/suds-0.4-py2.6.egg/suds/bindings /binding.py", line 265, in get_fault
raise WebFault(p, faultroot)
suds.WebFault: Server raised fault: 'Server was unable to process request. ---> Object reference not set to an instance of an object.'

2 个答案:

答案 0 :(得分:0)

尝试使用wireshark(或仅调试)来捕获正在运行的Adobe Air Client的完整请求和响应。然后捕获您生成的客户端的请求/响应。比较这两个请求并确定您未创建哪些对象并添加到客户端。

答案 1 :(得分:0)

您的代码的问题是没有为CheckIfAuthorized调用生成Authentication头,因为根据WSDL需要它。看看我对你的另一个问题的回答,该问题包含使用suds创建的示例SOAP客户端,该请求为请求添加了必需的header元素:

soap ui generated code

相关问题