пространства имен в SOAPpy не работают должным образом - PullRequest
3 голосов
/ 31 марта 2011

У меня проблема с корректным взаимодействием с SOAP API, работающим на Axis2:

Что происходит, я должен вызвать метод login с двумя аргументами (loginName и password), и он возвращает маркер аутентификации, который я буду использовать для последующего взаимодействия.

#!/usr/bin/python

from SOAPpy import SOAPProxy

s_user = 'Administrator'
s_pass = 'securityThroughObscurity'
s_host = '192.168.76.130:8998'

namespace = 'http://bcc.inc.com/IncSecurity'
url = 'http://' + s_host + '/axis2/services/IncSecurityService'

DHCPServ = SOAPProxy(url, namespace)
DHCPServ.config.dumpSOAPOut = 1
DHCPServ.config.dumpSOAPIn = 1
DHCPResp = DHCPServ.login(loginName=s_user, password=s_pass)

Сервер Axis2 на другой стороне возвращает ошибку XML, сообщающую Data element of the OM Node is NULL. Глядя на журналы Axis2, я вижу ошибку adb_login.c(383) non nillable or minOuccrs != 0 element loginName missing

Затем пакет захватил XML-файл login от известного работающего Java-клиента по сравнению с XML-кодом этого клиента, и между ними есть различия:

SOAPpy:

<ns1:login xmlns:ns1="http://bcc.inc.com/IncSecurity" SOAP-ENC:root="1">
<password xsi:type="xsd:string">securityThroughObscurity</password>
<loginName xsi:type="xsd:string">Administrator</loginName>
</ns1:login>

Java:

<ns2:login xmlns:ns2="http://bcc.inc.com/IncSecurity">
<ns2:loginName>Administrator</ns2:loginName>
<ns2:password>securityThroughObscurity</ns2:password>
</ns2:login>

Таким образом, это означает, что по какой-то причине (возможно, из-за моего недостатка знаний в Python и SOAPpy) пространство имен не применяется к переменным, используемым в методе login, поэтому, во всех учетных записях они на самом деле не существует и ошибка гарантирована.

Кроме того, кажется, что они переворачивают переменные и вводят пароль перед loginName, но я не думаю, что это имеет большое значение.

Что я делаю не так?

1 Ответ

2 голосов
/ 26 апреля 2011

Похоже, это известная ошибка в SOAPPy, кто-то предложил простой патч: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=523083

Альтернативно (при условии, что у вас есть доступ к службе WSDL), SOAPPy позволяет вам указывать WSDL вместо просто пространства имен. Это похоже на то, что это обеспечит лучшую информацию о пространстве имен для кода генерации конвертов. http://diveintopython.net/soap_web_services/introspection.html

Наконец, если SOAPPy просто не работает для вас, попробуйте Suds (это лучше задокументировано , чем SOAPPy).

from suds.client import Client
from suds.wsse import *
client = Client(WSDL_LOCATION)
guid = client.service.someFunctionName("a string argument", 42)

Удачи!

...