2011-08-11 17 views
14

¿Puedo tener la ubicación soap: dirección en un WSDL relativo a la ubicación WSDL, o al menos relativo al servidor? Por ejemplo, yo quiero escribir:jabón WSDL relativo: dirección de ubicación

<soap:address location="https://exampleserver.com/axis2/services/ExampleService" /> 

como:

<soap:address location="/axis2/services/ExampleService" /> 

Esto permitiría una implementación más rápida a varios servidores, como los servidores de prueba. Además, en el caso de axis2c, si quiero que mi servicio se use desde HTTP o HTTPS, la vida se vuelve más difícil para los desarrolladores que usan mi servicio, ya que no pueden simplemente importar el WSDL de su ubicación predeterminada "? WSDL".

+0

_la vida se vuelve más difícil para los desarrolladores que usan mi servicio, ya que no pueden simplemente importar el wsdl desde su ubicación predeterminada "? WSDL" _ No entiendo esta parte. ¿Por qué es difícil la vida si tiene una dirección absoluta en WSDL en lugar de una relativa? –

+0

Porque tiene solo una dirección y necesitan 2 direcciones (una para https y otra para http). – Mihai

+0

Cuando consumo webservices, ignoro totalmente la dirección SOAP y anulo esto en mi cliente. Al escribir servidores, simplemente escriba algo aleatorio pero válido. –

Respuesta

7

El WSDL describe a los clientes los formatos de mensaje, tipos, parámetros, etc. necesarios para interactuar con el servicio web. Esto es utilizado por herramientas como WSDL2C para generar el código necesario para la interacción.

Pero incluso si expone su servicio en HTTP o HTTPS, el código de código del cliente será el mismo. No regenera los talones de su cliente para cada dirección de punto final. El cliente permanece igual, es el punto de acceso el que cambia.

Esta dirección no debe estar codificada en el código del cliente generado, debe ser una URL configurable dentro de la aplicación del cliente.

Claro, usted tiene una URL especificada dentro del WSDL y es una molestia cuando despliega su servicio web en el servidor de desarrollo, y luego en la puesta en escena y luego en la producción. Los puntos finales serán diferentes en cada entorno (tal vez se multipliquen por 2 para HTTP + HTTPS), pero en este punto sus desarrolladores no se verán afectados porque no regenera el código.

Cuando se trata de acceder al servicio web, aún tendría direcciones diferentes (para los servidores de desarrollo, creación de etapas y prod) incluso si fuera relativo o absoluto. Por lo tanto, no veo cómo es útil tener una dirección relativa dentro del WSDL, ya que aún tiene que administrar los puntos de acceso en la configuración del cliente.

+2

En PHP, la forma más sencilla de acceder a un servicio web es proporcionar la ubicación WSDL en el constructor de SoapClient. La dirección del servicio se toma del wsdl. Si hay una incorrecta en el wsdl, el cliente del servicio tendrá que especificar la correcta a mano. Está seguro de tener una incorrecta si utiliza el servicio tanto en http como en https, a menos que cambie dinámicamente la dirección de wsdl. – Mihai

3

Después de una larga búsqueda, estoy casi seguro de que el atributo soap:addresslocation tiene que ser una URL absoluta. Esto complica las cosas más si trabaja en entornos diferentes, como desarrollo, prueba y producción.

Tal vez una solución sería leer, en el lado del cliente, la primera parte de la URL de un archivo de configuración (por ejemplo, https://exampleserver.com) y la parte final del WSDL (por ejemplo, /axis2/services/ExampleService) y combinarlos para construir una ruta absoluta . El primero le permitirá cambiar de entorno.

+0

Esto es lo que estoy buscando. Pero parece que no puedo hacerlo. – elcool

4

Hay dos formas de obtener el WSDL.

Uno donde se sirve un WSDL no modificable, por ejemplo:

https://hostname/contextname/services/myAPIService/myAPI.wsdl 

y otro donde se sirve un WSDL generado, por ejemplo:

https://hostname/contextname/services/myAPIService?wsdl 

Si utiliza la opción dinámica utilizará este código:

req.getRequestURL().toString(); 

para obtener la URL que se utilizará en el WSDL generado. Este código está en la clase ListingAgent (en el paquete org.apache.axis2.transport.http).

Según lo que mencionó en su pregunta, si desea tener una ubicación relativa, debe ser porque desea usarla en varios servidores, por lo que deberá usar la opción dinámica.

Un problema que encontré con las opciones dinámicas es que si en el WSDL original la ubicación utiliza HTTP, entonces en el generado todavía usará HTTP aunque haya utilizado HTTPS para acceder a él. (Esto sucede en la versión 1.5 que es la que está usando mi proyecto)

Otro problema es si está utilizando un equilibrador de carga, porque el WSDL generado se generará con la ubicación del servidor final en lugar del equilibrador. Una opción para esto sería extender las clases AxisServlet y ListingAgent para reemplazar el código mencionado anteriormente.

Cuestiones relacionadas