Доступ к веб-сервису - PullRequest
       28

Доступ к веб-сервису

5 голосов
/ 02 апреля 2011

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

Ответы [ 2 ]

0 голосов
/ 21 сентября 2011

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

код, сгенерированный пользовательским интерфейсом soap

0 голосов
/ 03 апреля 2011

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

...