[pyar] Web service de tipo WCF

Mauricio Baeza mauricio02 en correolibre.org
Mie Ago 21 12:46:33 ART 2013


Hola Mariano...

Gracias a tu ejemplo y guía, he podido migrar todo de Suds a
pysimplesoap, la próxima versión de Factura Libre lo usará completamente...

Esto merece unas cervezas...

Solo una ultima cuestión... esta rama experimental... ¿tienes alguna
fecha para publicarse para producción?... si bien hasta ahora no he tenido
ningún problema en mis pruebas... ¿hay algo que tenga que considerar
para pasarla a producción?... nuevamente gracias...

Un abrazo


On 08/19/2013 11:18 PM, Mariano Reingart wrote:
> Hola Mauricio:
>
> Justamente estoy trabajando en PySimpleSoap para mejorar el sobre el
> soporte de espacios de nombre para webservices .Net complejos.
> Además, hubo varias personas que enviaron varios parches al proyecto.
> Podes probar la última versión, mi rama experimental "wsdl_namespaces":
>
> hg clone https://code.google.com/p/pysimplesoap/
> cd pysimplesoap
> hg update wsdl_namespaces
>
> Luego, podes controlar los espacios de nombre y prefijos con los
> parámetros ns y soap_ns del constructor de SoapClient.
> Incluso se podría usar el prefijo SOAP-ENV en mayúsculas como en tu
> ejemplo, pero es una cuestión menor ya que es equivalente (fijate que
> también lo llama ns1 en tu ejemplo, para la misma URI).
>
> Te adjunto el ejemplo de código, con los datos que enviaste, el
> webservice no solo acepta el requerimiento y no da error, sino hasta
> responde con un token:
>
> Requerimiento:
>
> <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope
> xmlns:ns0="http://Ecodex.WS.Model/2011/CFDI"
> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
> <soapenv:Header/>
> <soapenv:Body>
>     <ns0:SolicitudObtenerToken>
>     <ns0:RFC>AAA010101AAA</ns0:RFC><ns0:TransaccionID>1234</ns0:TransaccionID></ns0:SolicitudObtenerToken>
> </soapenv:Body>
> </soapenv:Envelope>
>
> Respuesta:
>
> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><RespuestaObtenerToken
> xmlns="http://Ecodex.WS.Model/2011/CFDI"><Token>387fbac490d31d6f51d3049b7bbd84c44b3bbb0b</Token><TransaccionID>1234</TransaccionID></RespuestaObtenerToken></s:Body></s:Envelope>
>
> En cuanto tenga tiempo voy a ver de ponerlo como un test, para que ya
> quede en el proximo lanzamiento de la biblioteca.
>
> Cualquier cosa avisame,
>
> Sds
>
> Mariano Reingart
> http://www.sistemasagiles.com.ar
> http://reingart.blogspot.com
>
>
> 2013/8/18 Mauricio Baeza <mauricio02 en correolibre.org>:
>> Hola Mariano...
>>
>> Recuerdo en algún momento haber probado pysimplesoap sin éxito... SUDS es
>> muy bueno pero es algo grande a mi me gustan las cosas simples, estoy
>> todavía en la intención de usar pysimplesoap para Factura Libre...
>>
>> De acuerdo a tu ejemplo, pysimplesoap genera:
>>
>> <?xml version="1.0" encoding="UTF-8"?><soap:Envelope
>> xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
>> xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
>> <soap:Header/>
>> <soap:Body>
>>     <SolicitudObtenerToken xmlns="http://Ecodex.WS.Model/2011/CFDI/Imports">
>>
>> <RFC>AAA010101AAA</RFC><TransaccionID>1234</TransaccionID></SolicitudObtenerToken>
>> </soap:Body>
>> </soap:Envelope>
>>
>> pero la forma que espera el web service del proveedor es:
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <SOAP-ENV:Envelope xmlns:ns0="http://Ecodex.WS.Model/2011/CFDI"
>> xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/"
>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>> xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
>>    <SOAP-ENV:Header/>
>>    <ns1:Body>
>>       <ns0:SolicitudObtenerToken>
>>          <ns0:RFC>AAA010101AAA</ns0:RFC>
>>          <ns0:TransaccionID>1234</ns0:TransaccionID>
>>       </ns0:SolicitudObtenerToken>
>>    </ns1:Body>
>> </SOAP-ENV:Envelope>
>>
>> hice varias pruebas con los parámetros del método:
>> https://code.google.com/p/pysimplesoap/wiki/SoapClient
>> sin éxito, es obvio que no la estoy usando bien por que veo que es bastante
>> configurable, si me das solo una guía por donde seguir yo le doy...
>>
>>
>> Un abrazo...
>>
>>
>> ____________________________________
>> Todo lo que no es dado es perdido
>>
>>
>> 18/08/13 10:12:21, Mariano Reingart <reingart en gmail.com>:
>>
>> Federico:
>>
>> Para consumir (usar) un webservice con pysimplesoap sería similar a
>> suds , debes crear el cliente y llamar a los métodos.
>> No hace falta crear clases ni nada complejo, las estructuras de datos
>> se manejan con tipos simples de python, por lo que no deberías tener
>> algunos de los problemas de suds y otras librerías similares.
>>
>> Usando el ejemplo que dieron en otro email (tendrías que cambiar el
>> wsdl para tu caso):
>>
>>>>> from pysimplesoap.client import SoapClient
>>>>>
>>>>> WSDL = "http://pruebas.ecodex.com.mx:2044/ServicioSeguridad.svc?wsdl"
>>>>> client = SoapClient(wsdl=WSDL, ns="s")
>> Luego podes inspeccionar client.services para ver que servicios y
>> métodos expone:
>>
>> {'Seguridad': {'documentation': '',
>> 'ports': {'PuertoSeguridad': {
>> 'location': 'http://pruebas.ecodex.com.mx:2044/ServicioSeguridad.svc',
>> 'name': 'PuertoSeguridad',
>> 'operations': {'ObtenerToken': {
>> 'action': 'http://Ecodex.WS.Model/2011/CFDI/Seguridad/ObtenerToken',
>> 'documentation': '',
>> 'header': None,
>> 'input': {'SolicitudObtenerToken': {
>> 'RFC': str,
>> 'TransaccionID': long}},
>> 'name': 'ObtenerToken',
>> 'output': {'RespuestaObtenerToken': {
>> 'Token': str,
>> 'TransaccionID': long}},
>> 'parts': {'input_body': None,
>> 'input_header': None,
>> 'output_body': None,
>> 'output_header': None}}},
>> 'port_type_name': 'Seguridad',
>> 'service_name': 'Seguridad',
>> 'soap_uri': 'http://schemas.xmlsoap.org/wsdl/soap/',
>> 'soap_ver': 'soap11',
>> 'transport': 'http://schemas.xmlsoap.org/soap/http'},
>> 'PuertoSeguridadSeguro': {
>> 'location': 'https://pruebas.ecodex.com.mx:2045/ServicioSeguridad.svc',
>> 'name': 'PuertoSeguridadSeguro',
>> 'operations': {'ObtenerToken': {
>> 'action': 'http://Ecodex.WS.Model/2011/CFDI/Seguridad/ObtenerToken',
>> 'documentation': '',
>> 'header': None,
>> 'input': {'SolicitudObtenerToken': {
>> 'RFC': str,
>> 'TransaccionID': long}},
>> 'name': 'ObtenerToken',
>> 'output': {'RespuestaObtenerToken': {
>> 'Token': str,
>> 'TransaccionID': long}},
>> 'parts': {'input_body': None,
>> 'input_header': None,
>> 'output_body': None,
>> 'output_header': None}}},
>> 'port_type_name': 'Seguridad',
>> 'service_name': 'Seguridad',
>> 'soap_uri': 'http://schemas.xmlsoap.org/wsdl/soap/',
>> 'soap_ver': 'soap11',
>> 'transport': 'http://schemas.xmlsoap.org/soap/http'}}}}
>>
>>
>> En 'operations' podes ver que tiene una operación ObtenerToken, podes
>> ver la firma con client.help:
>>
>>>>> print client.help('ObtenerToken')
>> ObtenerToken(RFC=<type 'str'>, TransaccionID=<type 'long'>)
>> -> {u'Token': <type 'str'>, u'TransaccionID': <type 'long'>}:
>>
>> Ahi te dice cuales son los parámetros, simplemente donde dice type str
>> o long tenes que reemplazar por el valor.
>> Te indica que devuelve un diccionario con dos claves Token y TransaccionID.
>>
>> Para llamar al método remoto sería:
>>
>>>>> retval = client.ObtenerToken(RFC="Saraza", TransaccionID=1234)
>>>>> print retval['Token']
>>>>> print retval['TransaccionID']
>> Te adjunto un ejemplo completo con lo que envió Mauricio.
>>
>> Cualquier cosa avisame y lo vemos,
>>
>> Sds
>>
>> Mariano Reingart
>> http://www.sistemasagiles.com.ar
>> http://reingart.blogspot.com
>>
>>
>> 2013/8/18 Federico Manuel Echeverri Choux <echeverrifm en gmail.com>:
>>> Hola!!!! gente, probe los que me dijeron el tuyo angel lo probe con dos
>>> webservice, uno me funciono y el otro me da error
>>> Esto Use:
>>>
>>> from suds.client import Client
>>> url = 'http://localhost:7080/webservices/WebServiceTestBean?wsdl'
>>> client = Client(url)
>>>
>>>
>>>
>>> el que te comente que me da error me devuelve esto:
>>>
>>>
>>> File "/usr/lib/python2.7/dist-packages/suds/wsdl.py", line 177, in
>>> add_children
>>> child = Factory.create(c, self)
>>> File "/usr/lib/python2.7/dist-packages/suds/wsdl.py", line 920, in create
>>> return fn(root, definitions)
>>> File "/usr/lib/python2.7/dist-packages/suds/wsdl.py", line 432, in
>>> __init__
>>> NamedObject.__init__(self, root, definitions)
>>> File "/usr/lib/python2.7/dist-packages/suds/wsdl.py", line 90, in __init__
>>> WObject.__init__(self, root, definitions)
>>> File "/usr/lib/python2.7/dist-packages/suds/wsdl.py", line 58, in __init__
>>> Object.__init__(self)
>>> File "/usr/lib/python2.7/dist-packages/suds/sudsobject.py", line 132, in
>>> __init__
>>> self.__metadata__ = Metadata()
>>> RuntimeError: maximum recursion depth exceeded
>>>
>>>
>>> Lo tuyo Mariano aun no lo entiendi muy bien, ahora me dedico a eso a ver
>>> que
>>> me sale.
>>>
>>> Que tan grave es que publique el link??
>>>
>>> es este: ( Modificado )
>>>
>>> https://webservice.com/WS_WSDI/WebServices.WSDI.Timbrado.svc?wsdl
>>>
>>> Saludos y Gracias
>>>
>>>
>>>
>>>
>>>
>>> El 15 de agosto de 2013 18:35, Angel Java Lopez <ajlopez2000 en gmail.com>
>>> escribió:
>>>> Hola gente!
>>>>
>>>>
>>>> Federico, apenas si programo en Python, apenas lo conozco. Pero
>>>> cualquiera
>>>> que vaya a consumir WCF trata de sacar todo de lo que el WSDL (Web
>>>> Service
>>>> Description Language). Fijate que aca dice en general como obtenerlo:
>>>>
>>>>
>>>>
>>>> http://www.warden.pl/2013/02/21/consuming-wsdl-web-services-with-perl-or-python/
>>>>
>>>> Y ahi usa una libreria suds
>>>> https://fedorahosted.org/suds/
>>>>
>>>> que dado el WSDL, te deja ya armado el metodo de invocacion, con monio
>>>> parece ;-)
>>>>
>>>> Te funciono?
>>>>
>>>> Nos leemos!
>>>>
>>>> Angel "Java" Lopez
>>>> @ajlopez
>>>>
>>>>
>>>>
>>>> 2013/8/15 Federico Manuel Echeverri Choux <echeverrifm en gmail.com>
>>>>> Hola!!!! gente, alguien hizo algo con webservice WCF?? alguna doc que me
>>>>> puedan pasar para ver si puedo hacer esto.
>>>>>
>>>>> Muchisimas gracias de antemano
>>>>>
>>>>>
>>>>> --
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>>
>>>>
>>>> V


-- 
__________________________________________________
Todo lo que no podemos dar nos posee... Andre Gide
universolibre.org



More information about the pyar mailing list