python - example - Cambiar la URL del servicio web para un cliente de jabonaduras en tiempo de ejecuciĆ³n(manteniendo el wsdl)
python zeep response (3)
Es posible que pueda hacer eso especificando la location
del servicio. Suponiendo que tiene un objeto Client
llamado client
, puede modificar la ubicación del servicio actualizando la URL en client.options.location
.
Además, puede utilizar una copia local de un archivo WSDL como url
al construir el cliente utilizando un esquema file://
para la URL, por ejemplo, file:///path/to/service.wsdl
. Entonces esta podría ser otra opción para ti. Por supuesto, también debería especificar la location
para que la ubicación predeterminada desde dentro del WSDL se anule.
Primero que nada, mi pregunta es similar a esta
Pero es un poco diferente. Lo que tenemos es una serie de entornos, con el mismo conjunto de servicios. Para algunos entornos (los locales) podemos obtener acceso al wsdl, y así generar el cliente de espuma. Para un entorno externo, no podemos acceder al wsdl. Pero al ser el mismo, esperaba poder cambiar solo la URL sin regenerar el cliente. Intenté clonar el cliente, pero no funciona.
Editar: agregar código:
host=''http://.../MyService.svc''
wsdl_file = ''file://..../wsdl/MyService.wsdl''
client = suds.client.Client(wsdl_file, location=host, cache=None)
#client = baseclient.clone()
#client.options.location = otherhost
client.set_options(port=''BasicHttpBinding_IMyService'')
result = client.service.IsHealthy()
Eso me da esta excepción:
El mensaje con la acción '' http://tempuri.org/IMyService/IsHealthy '' no puede procesarse en el receptor, debido a una discrepancia de ContractFilter en el EndpointDispatcher. Esto puede deberse a una discrepancia en el contrato (acciones no coincidentes entre el emisor y el receptor) o una falta de correspondencia vinculante / de seguridad entre el emisor y el receptor. Verifique que el emisor y el receptor tengan el mismo contrato y el mismo enlace (incluidos los requisitos de seguridad, por ejemplo, Mensaje, Transporte, Ninguno).
El caso es que si configuro el cliente directamente en el host, funciona bien: client = suds.client.Client (host)
Como puede ver, he intentado clonar el cliente, pero con la misma excepción. Incluso intenté esto:
baseclient = suds.client.Client(host)
client = baseclient.clone()
client.options.location = otherhost
....
Y obtuve la misma excepción.
¿Alguien puede ayudarme?
¡Lo tengo!. Ni siquiera sé cómo lo he descubierto, pero con un poco de adivinanzas y mucha suerte terminé con esto:
wsdl_file = ''file://...../MyService.wsdl''
client = suds.client.Client(wsdl_file)
client.wsdl.url = host #this line did the trick
client.set_options(port=''BasicHttpBinding_IMyService'')
result = client.service.IsHealthy()
¡Y funciona! No puedo encontrar ninguna documentación sobre esa propiedad (client.wsdl.url), pero funciona, así que la publico en caso de que alguien tenga el mismo problema.
client.sd[0].service.setlocation(new_url)
... es la forma "manual", es decir. por descripción del servicio .
client.set_option(new_url)
... también debería funcionar, según el autor .
options
es un attr envuelto / protegido - las ediciones directas pueden ser ignoradas.