Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Acceso a un Statefull WS desde PHP

Estas en el tema de Acceso a un Statefull WS desde PHP en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Llevo mas de cuatro dias buscando por Internet informacin de como acceder a un Stateful WS desarrollado en JAVA desde PHP. El error que me ...
  #1 (permalink)  
Antiguo 30/07/2009, 06:42
 
Fecha de Ingreso: julio-2009
Mensajes: 4
Antigüedad: 15 años, 5 meses
Puntos: 0
Acceso a un Statefull WS desde PHP

Llevo mas de cuatro dias buscando por Internet informacin de como acceder a un Stateful WS desarrollado en JAVA desde PHP. El error que me daba, porque ahora es otro, era:

Esto es un servicio web con estados y es necesario el encabezado {xxxx://jax-ws.dev.java.net/xml/ns/}objectId.

Despues de mucho buscar le he añadido una cebecera SOAP y el error ha cambiado por este:

Valor de encabezado {xxxx://jax-ws.dev.java.net/xml/ns/}objectId no válido/caducado: 130e3303-4dbe-4cec-9595-b049f8892cfc

Pero ese ID de sesion es el que obtengo en el mismo PHP, por lo tanto no puede estar caducado. He visto por medio de la apliacion Ethereal (trafico de red) que el XML que envia mi PHP carece de algunos "<" y ">" que han sido sustituidos por &lt; y &gt;. No se si el error será por esta pero como decia al principio del post, parece como si nadie hubiese hecho esto antes.

Muchas Gracias
Paco Ortega
  #2 (permalink)  
Antiguo 30/07/2009, 08:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 7 meses
Puntos: 2135
Respuesta: Acceso a un Statefull WS desde PHP

Prueba usar htmlentitydecode sobre tu variable para evitar que los < y > se conviertan por &lt; y &gt;

Saludos.
  #3 (permalink)  
Antiguo 03/08/2009, 01:14
 
Fecha de Ingreso: julio-2009
Mensajes: 4
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Acceso a un Statefull WS desde PHP

No puedo usar esa funcion porque lo que le envio a la cabacera es un objeto, este es el codigo:

// Parametros para la llamada
$parametros = array("LanguageId" => "es_ES", "DestinationName" => "Madrid");
$soapHeader = new SoapHeader($nameSpace,"objectId",$SessionId,0);

echo "<br><hr><br><pre>";
print_r($soapHeader);
echo "</pre><br><hr><br>";

$resultado = $client->__soapCall("getDestinationSearch", $parametros, NULL, $soapHeader, $output_headers);


Es decir que se compone solo, yo no se lo envio con codigos.
  #4 (permalink)  
Antiguo 03/08/2009, 09:10
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 18 años, 1 mes
Puntos: 8
Mensaje Respuesta: Acceso a un Statefull WS desde PHP

tengo entendido que en hay problemas con la extension SOAP de php5 para la transferencia de objetos u objetos anidados, el caso es que aqui te muestro una de las tantas formas de solucionarlo.

Código PHP:
<?php

abstract class SoapWrapper {
    public function 
getAsSOAP() {
        foreach(
$this as $key=>&$value) {
            
$this->prepareSOAPrecursive($this->$key);
        }
        return 
$this;
    }

    private function 
prepareSOAPrecursive(&$element) {
        if(
is_array($element)) {
            foreach(
$element as $key=>&$val) {
                
$this->prepareSOAPrecursive($val);
            }
            
$element=new SoapVar($element,SOAP_ENC_ARRAY);
        }elseif(
is_object($element)) {
            if(
$element instanceof SoapWrapper) {
                
$element->getAsSOAP();
            }
            
$element=new SoapVar($element,SOAP_ENC_OBJECT);
        }
    }

// ------------------------------------------
//  Ejemplo de uso
// ------------------------------------------

class PersonList extends SoapWrapper {
    protected 
$ArrayOfPerson
}

class 
Person extends SoapWrapper {


$client=new SoapClient("demo.wsdl", array( 'soap_version'=>SOAP_1_2'trace'=>1'classmap' => array('Person' => "Person"'PersonList' => "PersonList")  ));
$PersonList=new PersonList;
$PersonList->getAsSOAP();

//Continuas aqui con tus metodos u operaciones.

?>
por tanto, cada clase que necesite realizar transferencias via SOAP, deberá extender desde SoapWrapper.

Como puedes ver, en el código anterior, la función prepareSOAPrecursive busca objetos anidados en los nodos padres o en arreglos de objetos, de ser asi, entonces intenta llamar a la funcion getAsSOAP() para preparar los objetos anidados y pasar por el SoapVar.

lo unico que tendras que hacer es siempre antes de transmitir $ obj-> getAsSOAP () y listo.

Enjoy it!...
  #5 (permalink)  
Antiguo 04/08/2009, 06:17
 
Fecha de Ingreso: julio-2009
Mensajes: 4
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Acceso a un Statefull WS desde PHP

Juer, no he entendido na de na... lo he hecho así, pero no entiendo NADA

Cita:
// ------------------------------------------
// Ejemplo de uso
// ------------------------------------------
class PersonList extends SoapWrapper
{
protected $ArrayOfPerson;
}

class Person extends SoapWrapper
{
}

$client=new SoapClient("MY WSDL",
array( 'soap_version'=>SOAP_1_2, 'trace'=>1, 'classmap' => array('Person' => "Person", 'PersonList' => "PersonList") ));
$PersonList=new PersonList;
$PersonList->getAsSOAP();

//Continuas aqui con tus metodos u operaciones.
try
{
// Valores
$nameSpace = "EL ESPACIO DE NOMBRES DE LAS CABECERAS";
$SessionId = "bc1e84c4-b5c4-4713-9476-882ac2fa7897";

// Parametros para la llamada
$parametros = array("LanguageId" => "es_ES", "DestinationName" => "Madrid");
$soapHeader = new SoapHeader($nameSpace,"objectId",$SessionId,0);

echo "<br><hr><br><pre>";
print_r($soapHeader);
echo "</pre><br><hr><br>";

$resultado = $client->__soapCall("getDestinationSearch", $parametros, NULL, $soapHeader, $output_headers);


}
catch(SoapFault $fault)
{
//echo '<b>Mensaje:</b> ' .$e->getMessage();

echo "<pre>*** ERROR ***<br><br>";
echo "Fault Code : ".$fault->faultcode."<br>";
echo "Fault String : ".$fault->faultstring."<br>";
echo "Fault Actor : ".$fault->faultactor."<br><br>";
echo "</pre><br><br>";
}
  #6 (permalink)  
Antiguo 04/08/2009, 11:28
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 18 años, 1 mes
Puntos: 8
Buenas, te gustaría pegar aqui la salida que optienes?

si no estoy mal, pienso que deberias pasar a la llamada es el valor(es) obtenidos desde getAsSOAP().

puedo hacer el ejemplo con l oque planteas, pero me gustaría visualizar cual es tu salida o en su efecto lo que estas haciendo tu en tu propio codigo y/o como lo haces, de esta manera yo lo adapto a mi ejemplo.


Saludos.

Bueno mientras puedes analizar algo asi como esto y me cuentas (recuerda, adaptarlo para lo que realmente necesitas).

Código PHP:
<?php 

abstract class SoapWrapper 
    public function 
getAsSOAP() { 
        foreach(
$this as $key=>&$value) { 
            
$this->prepareSOAPrecursive($this->$key); 
        } 
        return 
$this
    } 

    private function 
prepareSOAPrecursive(&$element) { 
        if(
is_array($element)) { 
            foreach(
$element as $key=>&$val) { 
                
$this->prepareSOAPrecursive($val); 
            } 
            
$element=new SoapVar($element,SOAP_ENC_ARRAY); 
        }elseif(
is_object($element)) { 
            if(
$element instanceof SoapWrapper) { 
                
$element->getAsSOAP(); 
            } 
            
$element=new SoapVar($element,SOAP_ENC_OBJECT); 
        } 
    } 

// ------------------------------------------ 
//  Ejemplo de uso 
// ------------------------------------------ 

class PersonList extends SoapWrapper 
    protected 
$ArrayOfPerson;  


class 
Person extends SoapWrapper 
}  

$client=new SoapClient("MY WSDL", array( 'soap_version'=>SOAP_1_2'trace'=>1'classmap' => array('Person' => "Person"'PersonList' => "PersonList")  )); 
//$PersonList=new PersonList; 
//$PersonList->getAsSOAP(); 

//Continuas aqui con tus metodos u operaciones.
try 
{
    
// Valores
    
$nameSpace "EL ESPACIO DE NOMBRES DE LAS CABECERAS";
    
$SessionId "bc1e84c4-b5c4-4713-9476-882ac2fa7897";

    
// Parametros para la llamada
    
$parametros = array("LanguageId" => "es_ES""DestinationName" => "Madrid");
    
$soapHeader = new SoapHeader($nameSpace,"objectId",$SessionId,0);

    echo 
"<br><hr><br><pre>";
    
print_r($soapHeader);
    echo 
"</pre><br><hr><br>";
    
    
//TODO: reemplazo tu linea por lo que creo intentas hacer.
    
$PersonList=new PersonList
                
$client->MetodoRequerido($PersonList);
                
//TODO: un pequeño ejemplo de uso
    //$client->echoStruct(new SoapParam($PersonList, "inputStruct"));
    
    //TODO: de ser asi entonces pienso que solo deberias pasarlo en la seccion parametros no?
    //$resultado = $client->__soapCall("getDestinationSearch", $parametros, NULL, $soapHeader, $output_headers);

}
catch(
SoapFault $fault)
{
    
//echo '<b>Mensaje:</b> ' .$e->getMessage();

    
echo "<pre>*** ERROR ***<br><br>";
    echo 
"Fault Code : ".$fault->faultcode."<br>";
    echo 
"Fault String : ".$fault->faultstring."<br>";
    echo 
"Fault Actor : ".$fault->faultactor."<br><br>";
    echo 
"</pre><br><br>";
}

?>
espero dar en el punto que requieres... jeje y ahora si comprendas algo de algo. je je je...

Última edición por GatorV; 04/08/2009 a las 12:15
  #7 (permalink)  
Antiguo 05/08/2009, 01:22
 
Fecha de Ingreso: julio-2009
Mensajes: 4
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Acceso a un Statefull WS desde PHP

A ver si me se explicar. El error me da al intentar instanciar la clase PersonList de SOAPWrapper. A partir de ese momento no da mas errores.

Cita:
Este es el error:

Parse error: syntax error, unexpected T_CLASS, expecting T_FUNCTION in C:\AppServ\www\maqueta02\index2.php on line 31
No puedo pegar aqui el codigo completo porque no permite pegar las URLs del WSDL ni la definicion del ENCABEZADO

mi codigoqueda asi:

Código PHP:
<?php 

abstract class SoapWrapper 
    public function 
getAsSOAP() { 
        foreach(
$this as $key=>&$value) { 
            
$this->prepareSOAPrecursive($this->$key); 
        } 
        return 
$this
    } 

    private function 
prepareSOAPrecursive(&$element) { 
        if(
is_array($element)) { 
            foreach(
$element as $key=>&$val) { 
                
$this->prepareSOAPrecursive($val); 
            } 
            
$element=new SoapVar($element,SOAP_ENC_ARRAY); 
        }elseif(
is_object($element)) { 
            if(
$element instanceof SoapWrapper) { 
                
$element->getAsSOAP(); 
            } 
            
$element=new SoapVar($element,SOAP_ENC_OBJECT); 
        } 
    } 

// ------------------------------------------ 
//  Ejemplo de uso 
// ------------------------------------------ 

class PersonList extends SoapWrapper 
    protected 
$ArrayOfPerson;  


class 
Person extends SoapWrapper 
}  

$client=new SoapClient("---http:---//gisom.grupoiris.net/Gisom-hotels-ws/HotelOnlineService?wsdl", array( 'soap_version'=>SOAP_1_2'trace'=>1'classmap' => array('Person' => "Person"'PersonList' => "PersonList")  )); 
//$PersonList=new PersonList; 
//$PersonList->getAsSOAP(); 

//Continuas aqui con tus metodos u operaciones.
try 
{
    
// Valores
    
$nameSpace "---http---://jax-ws.dev.java.net/xml/ns/";
    
$SessionId "06f16f43-c6f5-4af0-aa29-4af377c78295";

    
// Parametros para la llamada
    
$parametros = array("LanguageId" => "es_ES""DestinationName" => "Madrid");
    
$soapHeader = new SoapHeader($nameSpace,"objectId",$SessionId,0);


    
// ESTO ES SOLO PARA VISUALIZAR EL OBJETO CABECERA
    
echo "<br><hr><br><pre>";
    
print_r($soapHeader);
    echo 
"</pre><br><hr><br>";
    
    
//TODO: reemplazo tu linea por lo que creo intentas hacer.
    //No sé porque le envias este parametro ni lo que contiene, los parametros deberian ser el array Parametros
    
$PersonList=new PersonList
    
$client->getDestinationSearch($PersonList);
    
    
//TODO: un pequeño ejemplo de uso
    //$client->echoStruct(new SoapParam($PersonList, "inputStruct"));
    
    //TODO: de ser asi entonces pienso que solo deberias pasarlo en la seccion parametros no?
    //$resultado = $client->__soapCall("getDestinationSearch", $parametros, NULL, $soapHeader, $output_headers);

}
catch(
SoapFault $fault)
{
    
//echo '<b>Mensaje:</b> ' .$e->getMessage();

    
echo "<pre>*** ERROR ***<br><br>";
    echo 
"Fault Code : ".$fault->faultcode."<br>";
    echo 
"Fault String : ".$fault->faultstring."<br>";
    echo 
"Fault Actor : ".$fault->faultactor."<br><br>";
    echo 
"</pre><br><br>";
}

?>
He colocado las URLs con --- por tema de SPAM, Muchas gracias por tu ayuda.

Última edición por The_Pakito; 05/08/2009 a las 01:28 Razón: cambios
  #8 (permalink)  
Antiguo 06/08/2009, 09:20
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 18 años, 1 mes
Puntos: 8
Respuesta: Acceso a un Statefull WS desde PHP

Cita:
//No sé porque le envias este parametro ni lo que contiene, los parametros
le envio el objeto de esta clase por que esta quedando mal generado el soap de tus parametros, es por ello que deben pasar por la clase soapwrapper, es decir tu calse, no la mia es la que debe implementar a soapwrapper, personlist es solo un ejemplo de como usar el soapwrapper entonces que contiene? la resultante de tu clase, lo que deseas enviar al servicio web desde du clase.

si deseas me envias un privado con tu msn o me pones un mail y me envias el archivo comple, lo ideal seria que conversaramos y asi te colaboraria, es con mucho gusto.
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 02:39.