访问Web服务

问题描述:

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

我需要连接到工作的客户并没有被证明是如此友好。它需要身份验证:

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

尝试使用Wireshark(或只是调试),以捕获工作Adobe空气客户完整的请求和响应。然后捕获您生成的客户端的请求/响应。比较这两个请求并确定您没有创建哪些对象并添加到您的客户端。

+0

我送缺少实际的认证PARAMATERS等有请求是没有办法来产生这些。我试图避免手写XML请求,然后发送它们有一个简单的http请求。 – grantk 2011-04-04 19:39:02

+0

试着研究这个例子。 http://svn.fedorahosted.org/svn/suds/trunk/tests/rhq.py。注意示例创建对象然后将其放入person对象,然后与该人员调用服务。 – sankyo 2011-04-05 17:01:17

+0

再次感谢,我看到如何使用人物。我也可以创建我的服务中列出的对象。问题是没有实际的方法来在服务器端创建任何这些对象,也没有任何接受它们作为参数的方法。我最终手动建立请求并发送它,现在我能够收到响应(尽管我确实使用了Java) – grantk 2011-04-06 14:56:48

您的代码的问题不是为您的CheckIfAuthorized调用生成验证标头,因为它根据WSDL需要。看看我的回答对您的其他问题,其中包含有泡沫样创建SOAP客户端,增加了所需的头元素来请求:

soap ui generated code