instalar example consumir python xml soap wsdl suds

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:

  1. Agregar xsi: type = "xsd: string" a cada elemento que causa problemas
  2. 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).