python zeep examples
WCF y Python (7)
Incluso si no hay un ejemplo específico de llamar a WCF desde Python, debería poder hacer un servicio completamente compatible con SOAP con WCF. Entonces, todo lo que tiene que hacer es encontrar algunos ejemplos de cómo llamar a un servicio SOAP normal desde Python.
Lo más simple será usar BasicHttpBinding en WCF y luego puede soportar sus propias sesiones pasando un token de sesión con cada solicitud y respuesta.
¿Hay algún código de ejemplo de un cpython (no IronPython) que pueda llamar al servicio Windows Communication Foundation (WCF)?
No conozco ningún ejemplo directo, pero si el servicio WCF está habilitado para REST, puede acceder a él a través de POX (XML simple llano) a través de los métodos REST / etc (si el servicio tiene alguno). Si tiene el control del servicio, también podría exponer los puntos finales a través de REST.
Solo para ayudar a alguien a acceder al servicio WCF SOAP 1.2 con WS-Addressing usando espuma. El principal problema es inyectar nombre de acción en cada mensaje.
Este ejemplo para python 3 y suds port https://bitbucket.org/jurko/suds .
Ejemplo utiliza autenticación personalizada basada en encabezados HTTP, la dejo tal como está.
TODO: Obtiene automáticamente api_direct_url de WSDL (en este momento está codificado).
from suds.plugin import MessagePlugin
from suds.sax.text import Text
from suds.wsse import Security, UsernameToken
from suds.sax.element import Element
from suds.sax.attribute import Attribute
from suds.xsd.sxbasic import Import
api_username = ''some''
api_password = ''none''
class api(object):
api_direct_url = ''some/mex''
api_url = ''some.svc?singleWsdl|Wsdl''
NS_WSA = (''wsa'', ''http://www.w3.org/2005/08/addressing'')
_client_instance = None
@property
def client(self):
if self._client_instance:
return self._client_instance
from suds.bindings import binding
binding.envns = (''SOAP-ENV'', ''http://www.w3.org/2003/05/soap-envelope'')
api_inst = self
class _WSAPlugin(MessagePlugin):
def marshalled(self, context):
api_inst._marshalled_message(context)
self._client_instance = Client(self.api_url,
plugins=[_WSAPlugin()],
headers={''Content-Type'': ''application/soap+xml'',
''login'':api_username,
''password'': api_password}
)
headers = []
headers.append(Element(''To'', ns=self.NS_WSA).setText(self.api_direct_url))
headers.append(Element(''Action'', ns=self.NS_WSA).setText(''Blank''))
self._client_instance.set_options(soapheaders=headers)
cache = self._client_instance.options.cache
cache.setduration(days=10)
return self._client_instance
def _marshalled_message(self, context):
def _children(r):
if hasattr(r, ''children''):
for c in r.children:
yield from _children(c)
yield c
for el in _children(context.envelope):
if el.name == ''Action'':
el.text = Text(self._current_action)
return
_current_action = None
def _invoke(self, method, *args):
try:
self._current_action = method.method.soap.action.strip(''"'')
return method(*args)
finally:
self._current_action = None
def GetRequestTypes(self):
return self._invoke(self.client.service.GetRequestTypes)[0]
def GetTemplateByRequestType(self, request_type_id):
js = self._invoke(self.client.service.GetTemplateByRequestType, request_type_id)
return json.loads(js)
def GetRequestStatus(self, request_guid):
return self._invoke(self.client.service.GetRequestStatus, request_guid)
def SendRequest(self, request_type_id, request_json):
r = json.dumps(request_json, ensure_ascii=False)
return self._invoke(self.client.service.SendRequest, request_type_id, r)
TL; DR: para wsHttpBinding (SOAP 1.2) use zeep
En caso de que alguien tenga problemas para usar espuma (o espuma-jurko para el caso) con WCF y wsHttpBinding (que es SOAP 1.2):
- espuma está muerta (ni siquiera puedo instalarla en python 3)
- suds-jurko parece un poco muerto. La versión 0.6 tiene un error de recursión infinito muy molesto (al menos en el WSDL expuesto por nuestro servicio) que se fija en la sugerencia pero que no se ha publicado y ha sido de 1.5 años (al momento de escribir esto en Feb''17) desde la última cometer.
Funciona en python 3 pero no es compatible con SOAP 1.2. La respuesta de Sovetnikov es un intento de que funcione con 1.2 pero no he logrado que funcione para mí. - El zeep parece ser el camino actual y funcionó de la caja (no estoy afiliado a Zeep, simplemente funciona para mí y pasé varias horas golpeando mi cabeza contra una pared de ladrillos tratando de hacer espuma).
Para que Zeep funcione, la configuración del host del servicio WCF debe incluir <security mode = "None" /> en el nodowsHttpBinding. En realidad, el zeep parece ser compatible con el nombre de usuario y la firma (x509) basado en WS-SE, pero no lo he intentado. Hablar de cualquier problema a su alrededor.
WCF necesita exponer la funcionalidad a través de un protocolo de comunicación. Creo que el protocolo más utilizado es probablemente SOAP sobre HTTP. Supongamos que eso es lo que estás usando entonces.
Eche un vistazo a este capítulo en Inmersión en Python . Le mostrará cómo hacer llamadas SOAP.
No conozco una forma unificada de llamar a un servicio WCF en Python, independientemente del protocolo de comunicación.
si necesita comunicación serializada binaria sobre tcp, entonces considere implementar una solución como Thrift.
suds .
from suds.client import Client
print "Connecting to Service..."
wsdl = "http://serviceurl.com/service.svc?WSDL"
client = Client(wsdl)
result = client.service.Method(variable1, variable2)
print result
Eso debería hacerte comenzar. Puedo conectarme a servicios expuestos de WCF y una capa RESTful. Es necesario que haya algún masaje de datos para ayudarlo a hacer lo que necesita, especialmente si necesita vincular varios espacios de nombres.