Foros del Web » Programando para Internet » PHP »

Como enviar un XML como request en NuSOAP.

Estas en el tema de Como enviar un XML como request en NuSOAP. en el foro de PHP en Foros del Web. Hola. Llevo varios días rompiéndome la cabeza contra un problema y no le doy hallado solución. A ver si me podeis ayudar. Tengo que conectarme ...
  #1 (permalink)  
Antiguo 03/06/2009, 10:27
Avatar de Llave  
Fecha de Ingreso: abril-2005
Ubicación: Galicia
Mensajes: 52
Antigüedad: 19 años
Puntos: 1
Como enviar un XML como request en NuSOAP.

Hola.

Llevo varios días rompiéndome la cabeza contra un problema y no le doy hallado solución. A ver si me podeis ayudar.

Tengo que conectarme con un WebService (lo llamaré WS) que contiene una base de datos de información.

Como datos, tengo un punto de entrada (EndPoint) wsdl, un método ("bebidas") y un parámetro ("refresco"). Enviando el string "limon", el WS me devuelve la composición de un refresco de limon en XML.
El servidor donde está alojada la web, que contiene el php con el que tengo que hacer la petición, es php 5.

Me he decidido a usar NuSOAP en vez de la SOAP nativa de php 5, porque la cantidad de datos que me devuelve el WS es brutal. Y NuSOAP organiza en array asociativo los datos de entrada y me permite un fácil manejo de ellos.

El código que tengo ahora mismo es tal que así (lo he limpiado un poco quitando comprobaciones de error).

Código PHP:
require_once("nusoap/lib/nusoap.php");

$wsdl "http://www.rutadelwsdl/start.swe?SWEExtSource=SecureWebService&SWEExtCmd=Execute";

// Instancio la clase.
$oSoapClient = new nusoap_client($wsdl"wsdl");

// Declaro parámetros. En mi caso parámetro.
$aParametros = array("refresco" => "limon");

$respuesta $oSoapClient->call("bebidas"$aParametros);

if (
$oSoapClient->fault)
{
    echo 
"Error al llamar el metodo<br/> ".$oSoapClient->getError();
}
else
{
    echo 
$respuesta;
        echo 
"Todo fue sin errores";



Bien, el código no falla. Pero no me devuelve nada. Sólo veo por pantalla "Todo fue sin errores". He probado a ver el código fuente del resultado y sólo aparece la cadena de texto.
Con soapUI, mandando una petición en XML (todas las etiquetas a piñón) consigo la respuesta, así que el WS funciona.

Me han comentado de todo: Que si puede haber conflicto de NuSOAP con las nativas de PHP5 y que desactive estas últimas (eso no lo probé aún), que si php da problemas con algunos WS...

El caso es que no me funciona y no sé por qué. ¿Alguna idea?

Otro caso que me comentaron es enviar la petición XML directamente al WS. Es decir, tener una variable estilo:
Código PHP:
$peticionXML "<etiqueta><etiqueta2><etiqueta3>limon</etiqueta3></etiqueta2></etiqueta1>"
Pero no sé como hacerlo (o sea...) no sé cómo modificar el call para añadir el xml directamente (en plan Request).
¿Alguien puede orientarme sobre esta segunda solución?
Gracias.

Última edición por Llave; 03/06/2009 a las 10:29 Razón: corrijo errores de acentuación.
  #2 (permalink)  
Antiguo 10/06/2009, 04:44
Avatar de Llave  
Fecha de Ingreso: abril-2005
Ubicación: Galicia
Mensajes: 52
Antigüedad: 19 años
Puntos: 1
Respuesta: Como enviar un XML como request en NuSOAP.

Bueno. Al final unos amigos me han acabado ayudando.
Dejo por aquí la solución que hallamos por si le sirve a más gente.

Código PHP:
// Añadimos la librería nuSOAP. Que es la que utilizaremos.
require_once("nusoap/lib/nusoap.php");

// Indicamos donde está el WSDL en nuestro disco o ruta externa.
$wsdl "./rutadelfichero.WSDL";
             
// Instanciamos la clase.
$oSoapClient = new nusoap_client($wsdltrue);

// Después de instanciar la clase, debemos asignar los siguientes namespaces.
$oSoapClient->namespaces = array(
     
'soapenv' => "http://schemas.xmlsoap.org/soap/envelope/",
     
'tg' => "http://www.rutadeltg.com/xml/tgweb",
     
'asi' => "http://rutadelasi/asi/"
);


/* si el WS no está hecho en PHP podría rechazar los métodos implementados.
Para evitar este problema le mandamos el XML directamente. */
$cadena =  '<asi:etiqueta><tg:Bebidas><tg:Refresco>LIMON</tg:Refresco></tg:Bebidas></asi:etiqueta>';
            
// El último parámetro es para evitar que pille el NameSpace por defecto del NuSOAP, que es http://tempuri.org
$respuesta $oSoapClient->call("bebidas"$cadena"");

// Miramos si hubo algún error.
if ($oSoapClient->getError())
{
    echo 
"<br/><br/>Error al llamar el metodo<br/> ".$oSoapClient->getError();
}
else
{
    
// La carga fue bien y tenemos datos en $respuesta.

Edito para añadir que esta solución lo que hace es "pasar" de la comunicación mediante métodos al WS en SOAP y le enviamos directamente el XML. De esa forma sabíamos que iba a funcionar sí o sí.
No es elegante, pero funciona.

Última edición por Llave; 10/07/2009 a las 04:33 Razón: Explico lo que difiere del comportamiento normal de un SOAP.
  #3 (permalink)  
Antiguo 03/08/2009, 08:55
 
Fecha de Ingreso: octubre-2008
Mensajes: 15
Antigüedad: 15 años, 5 meses
Puntos: 0
Exclamación Respuesta: Como enviar un XML como request en NuSOAP.

Bueno yo tengo una duda, de hecho ya es algo muy simple lo que creo que falta y es cuando una etiqueta tiene mas de un parámetro y sus respectivos valores, ej.

<producto clave="230" cantidad="1" otracosa="otracosa"/>

En este caso, ¿cuál es el formato?

Para el resto de las etiquetas me las arreglé así:

<request xsi:type="tns:request"><version xsi:type="xsd:string">2.0</Version><encabezado xsi:type="tns:encabezado"><id xsi:type="xsd:string"></id>...

esto lo encontré en uno de los ejemplos del nusoap, pero no viene un ejemplo como la etiqueta que te puse arriba.

Si ven algún otro error les agradecería me lo señalaran, saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 15:49.