2011-04-02 4 views
4

Я пытался написать клиенту для доступа к веб-сервису для работы. Я успешно написал клиентов, использующих SUDS и ZSI с Python. Я использовал 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.' 

ответ

0

пытаются использовать Wireshark (или просто отладки), чтобы захватить полный запрос и ответ для рабочего Adobe Air Client. Затем запишите запрос/ответ клиента, который вы создали. сравнить два запроса и определить, какие объекты вы не создаете и не добавляете к своему клиенту.

+0

Запрос Посылаю отсутствует фактические проверки подлинности Счетчики и т.д. Там это не метод их генерации. Я пытаюсь избежать написания запросов xml вручную, а затем отправка их имеет простой HTTP-запрос. – grantk

+0

попытайтесь изучить этот пример. http://svn.fedorahosted.org/svn/suds/trunk/tests/rhq.py. Обратите внимание, как пример создает объекты, а затем помещает их в объект person, а затем вызывает службу с этим человеком. – sankyo

+0

Еще раз спасибо, я вижу, как используются объекты человека. Я также могу создать объекты, перечисленные в моем сервисе. Проблема в том, что нет никакого реального метода для создания любого из этих объектов на стороне сервера или любых методов, которые принимают их как аргументы. Я закончил создание запроса вручную и отправил его, теперь я могу получить ответ (я использовал Java, хотя) – grantk

0

Проблема с вашим кодом не генерирует заголовок аутентификации для вашего проверочного запроса CheckIf, как требуется по WSDL. Посмотрите на мой ответ на ваш другой вопрос, содержащий образец SOAP-клиент, созданный с помощью мыльной пены, которая добавляет необходимый элемент заголовка для запроса:

soap ui generated code

Смежные вопросы