python - example - Adición de xsi: espacio de nombre de tipo y sobre al usar SUDS
suds python 3 (2)
La solución que encontré fue usar MessagePlugin para esencialmente arreglar manualmente el XML justo antes de enviarlo. Esperaba que hubiera algo más elegante, pero al menos esto funciona:
class SoapFixer(MessagePlugin):
def marshalled(self, context):
# Alter the envelope so that the xsd namespace is allowed
context.envelope.nsprefixes[''xsd''] = ''http://www.w3.org/2001/XMLSchema''
# Go through every node in the document and apply the fix function to patch up incompatible XML.
context.envelope.walk(self.fix_any_type_string)
def fix_any_type_string(self, element):
"""Used as a filter function with walk in order to fix errors.
If the element has a certain name, give it a xsi:type=xsd:string. Note that the nsprefix xsd must also
be added in to make this work."""
# Fix elements which have these names
fix_names = [''elementnametofix'', ''anotherelementname'']
if element.name in fix_names:
element.attributes.append(Attribute(''xsi:type'', ''xsd:string''))
Necesito interactuar con un servicio SOAP y estoy teniendo muchos problemas para hacerlo; Realmente apreciaría cualquier sugerencia sobre esto. El mensaje de error original fue:
org.apache.axis2.databinding.ADBException: Any type element type has not been given
Después de algunas investigaciones, resulta que esto es un desacuerdo entre SUDS y el servidor tiene que ver con cómo lidiar con
type="xsd:anyType"
en el elemento en cuestión.
Confirmé el uso de SOAPUI y después de un aviso para que el problema se solucione siguiendo estos pasos:
- Agregar xsi: type = "xsd: string" a cada elemento que causa problemas
- Agregar xmlns: xsd = "http://www.w3.org/2001/XMLSchema" al sobre SOAP
Entonces, donde SUDS actualmente hace esto:
<SOAP-ENV:Envelope ... xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<ns3:Body>
<ns0:method>
<parameter>
<values>
<table>
<key>EMAIL_ADDRESS</key>
<value>[email protected]</value>
</table>
</values>
</parameter>
</ns0:method>
en su lugar debería producir esto:
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<ns3:Body>
<ns0:method>
...
<parameter>
<values>
<table>
<key xsi:type="xsd:string">EMAIL_ADDRESS</key>
<value xsi:type="xsd:string">[email protected]</value>
</table>
</values>
</parameter>
</ns0:method>
¿Hay una forma correcta de hacer esto? He visto sugerencias de usar ImportDoctor o MessagePlugins, pero realmente no he aprendido cómo lograr el efecto deseado.
Es triste e hilarante, como muchas cosas sobre esta biblioteca en particular, pero aquí está la respuesta exacta:
http://lists.fedoraproject.org/pipermail/suds/2011-September/001519.html
de lo anterior:
soapenv = soapenv.encode(''utf-8'')
plugins.message.sending(envelope=soapenv)
se convierte en:
soapenv = soapenv.encode(''utf-8'')
ctx = plugins.message.sending(envelope=soapenv)
soapenv = ctx.envelope
Básicamente, es un error en la implementación, y usted puede parchear usted mismo editando la línea que ejecuta el complemento para devolver realmente los resultados del complemento, pero no estoy al tanto de una versión parcheada y actualizada de SUDS que corrija esto todavía (aunque No lo he buscado de cerca).