Got Punked?



Nightmare! Los web-services del Afip

Hace unos dias estuve lidiando desde el lado “under” con los ws del Afip. Digo del lado “under” porque trabajamos con Open Source y como lenguaje de desarrollo Ruby

Para poder usar los servicios de factura electronica primero hay que obtener un ticket a traves de un ws hecho en Java.

Tuvimos algunos inconvenientes por falta de ejemplos, pero el ws nos tiro las exceciones correctas y tuvimos buen soporte del Afip y salimos andando bastante rápido. Usamos la libreria de soap para ruby que se llama soap4r.

Cuando pasamos a los ws de negocio comenzo nuestra pesadilla. Decidi acceder primero a los servicios mas sencillos con pocos parametros y respuestas simples. Cuando empece a invocarlo nos daba un error de este tipo:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
    <soap:Fault>
        <faultcode>soap:Server</faultcode>
        <faultstring>
            Server was unable to process request. 
            ---&gt; Object reference not set to an instance of an object.
        </faultstring>
        <detail />
    </soap:Fault>
</soap:Body>
</soap:Envelope> 

Este tipo de errores en general, son errores no manejados por el código, detras de ese error puede estar sucediendo cualquier cosa. Mas precisamente lo que sucede es que se esta queriendo usar un objeto que no existe. Ahora como hago yo de mi lado para desde un xml querer usar un objeto que no existe?

Me irrite un poco con algunas respuestas del soporte como “En asp.net funciona bien” pero lo mas sincero fue “no tengo idea que pasa”

Entre idas y vueltas con la gente del Afip (no les faltó voluntad) no pude avanzar con el tema, la respuesta era: fijate que el xml tiene que coincidir con el del ws y practicamente era una foto. Anduve pidiendo ayuda por ahi, pero no me supieron decir que podia haber atras desde Object reference not set to an instance of an object.

Probando con Soapui que me pasaron del afip aparecio el problema. Los namespaces. Los ws de asp.net namespacean los nodos pero en el ejemplo de la llamada al servicio no lo hacen, por lo tanto si uno imita el ejemplo “nunca va a funcionar”.

Superado esto, ya consumiendo los ws, tuve problemas con el parsing del resultado con soap4r, agotado con el tema, decidi cortar por lo sano y simple y utilizar ROXML para armar los xml de los ws, le hice una extensión para namespacear los nodos y quedo funcionando.

Como seria este servicio si fuera REST?

May 3rd, 2007

powered by mephisto