es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Zeep recibió un argumento de palabra clave inesperado en la operación.

Estoy tratando de enviar una solicitud a un “WSDL WebServices”. Según la documentación, las solicitudes deben estar formateadas en XML.

Estoy usando Python y el módulo Zeep. La operación que quiero usar se llama ‘Consulta’ y los parámetros se llaman ‘Comercio’ y ‘NumPedido’ (el primero es de tipo numérico y el segundo es alfanumérico).
El código que he intentado es el siguiente:

from zeep import Client, Settings

settings = Settings(strict=False, xml_huge_tree=True)
client = Client('https://testws.punto-web.com/wcfadproc/srvproceso.svc?wsdl', settings=settings)

request_data = {'Comercio': '8004749', 'NumPedido': '7030510'}
client.service.ConsultaMarca(**request_data)

Pero esto me da un error

TypeError: {http://tempuri.org/}Consulta_Marca() got an unexpected keyword argument 'NumPedido'. Signature: 'xml: xsd:string'

¿Alguien puede darme algún consejo para solucionar esto? Porque parece que la operación es correcta, pero no sé por qué los parámetros están mal.

EDIT:

He probado este nuevo código:

from zeep import Client, xsd, Settings
settings = Settings(strict=False, xml_huge_tree=True)
client = Client('https://testws.punto-web.com/wcfadproc/srvproceso.svc?wsdl', settings = settings)
parameters = xsd.Element(
    'Consulta',
    xsd.ComplexType([
        xsd.Element(
            'Comercio', xsd.Integer()
        ),
        xsd.Element(
            'NumPedido', xsd.String()
        )
    ])
)

parameters_values = parameters(Comercio=8004749, NumPedido='7030510')
operation = client.service.ConsultaMarca(parameters_values)
operation

Esto me da otro error

The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation 'ConsultaMarca'. End element 'xml' from namespace 'http://tempuri.org/' expected. Found element 'Comercio' from namespace ''. Line 2, position 465

Pero creo que estoy más cerca porque si ejecuto client.service.Consulta_Marca(parameters), obtengo una respuesta válida, pero con valores nulos porque no se pasaron los valores de los parámetros.

¡Por favor, ayuda!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Según el mensaje de error, parece que la función Consulta_Marca() espera un único argumento de tipo string en lugar de dos argumentos clave (Comercio y NumPedido).

    Puedes intentar pasar directamente la solicitud XML como un string utilizando un f-string de Python de la siguiente manera:

    request_data = f'<consulta xmlns="http://tempuri.org/"><comercio>{comercio}</comercio><numpedido>{num_pedido}</numpedido></consulta>'
    client.service.Consulta_Marca(request_data)
    

    Esto debería crear un string XML correctamente formateado con los valores de Comercio y NumPedido y pasarlo como solicitud a la función Consulta_Marca().

    Alternativamente, puedes intentar definir los parámetros utilizando el método xsd.Element y pasarlo a la función Consulta_Marca():

    from zeep import Client, xsd, Settings
    
    settings = Settings(strict=False, xml_huge_tree=True)
    client = Client('https://testws.punto-web.com/wcfadproc/srvproceso.svc?wsdl', settings=settings)
    
    # Define los parámetros
    Consulta = xsd.Element(
        'Consulta',
        xsd.ComplexType([
            xsd.Element('Comercio', xsd.Integer()),
            xsd.Element('NumPedido', xsd.String()),
        ]))
    parameters = Consulta(Comercio=8004749, NumPedido='7030510')
    
    client.service.Consulta_Marca(parameters)
    

    Esto debería crear una solicitud XML correctamente formateada con los valores de Comercio y NumPedido y pasarla a la función Consulta_Marca().

Comments are closed.