访问网页服务

4 投票
2 回答
2940 浏览
提问于 2025-04-16 14:57

我一直在尝试写一个客户端来访问一个工作用的网络服务。我已经成功用Python的SUDS和ZSI写了一些客户端。还用NetBeans 6.9帮忙写了一些Java客户端。之前成功的客户端都是在网上找到的免费网络服务。

不过,我现在需要连接的这个工作用的客户端就没那么简单了。它需要身份验证:

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

我查看这个网络服务的WSDL描述,发现它有六个方法。

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

而且还有70种返回类型,其中一种就是身份验证类型。

在我的Python和Java客户端中,我能够创建这些身份验证对象,但之后就不知道该怎么做了。

从WSDL中我看不出有什么方法可以用现有的东西来创建这些身份验证对象。网络服务的提供者确实提供了一个用Adobe Air构建的客户端,我可以用它来测试,确保我能成功进行身份验证并使用这个网络服务。

这是我第一次要和网络服务对接,我不太确定自己是不是漏掉了什么。有没有人能告诉我,我在如何进行身份验证这方面是不是有什么明显的遗漏?

这是我写的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

你代码的问题在于没有为你的CheckIfAuthorized调用生成认证头,而这是根据WSDL的要求必须要有的。你可以看看我对你另一个问题的回答,里面有一个用suds创建的示例SOAP客户端,它会把所需的头元素添加到请求中:

soap ui生成的代码

0

试着用Wireshark(或者直接调试)来捕捉一下正常工作的Adobe Air客户端的完整请求和响应。然后再捕捉一下你自己生成的客户端的请求和响应。对比这两个请求,找出你没有创建和添加到自己客户端中的哪些对象。

撰写回答