Buenas tardes el dia de hoy
estuve navegando por mi pagina
favorita http://stackoverflow.com y me di cuenta que
varios compañeros del mundo de la programación se preguntaban lo siguiente:
how to get
the header on server side. php web-services soap wsdl nusoap?
Como leer/ recibir (Autenticar) el encabezado del lado del
servidor en php web-services soap wsdl
nusoap (nusoap authentication header on server side), así que decidí elaborar
este código para apoyarlos, ojo este es
un código bastante sencillo lo elabore en un descanso del trabajo si tienen
alguna observación o recomendación es
bien recibida. Bueno como dice mi profesor manos al código.
Primero vamos a Trabaja con SoapUi para consumir el servicio
tal como lo muestra la imagen:
Segundo vamos a elaborar el código a nivel de server con
NUSOAP tal como lo muestro a continuación:
require_once "lib/nusoap.php";
function Consulta ($Id)
{
$usuario="";
$password="";
global $server;
$requestHeaders = $server->requestHeader;
// aqui capturamos los headers y extraemos el username y el password cuando invocamos desde el aplicativo SOAPUI
$headers = apache_request_headers();
foreach($headers as $key=>$value) { if ($key=='username'){ $usuario=$value;} if ($key=='password'){ $password=$value;} }
// aqui capturamos los headers y extraemos el username y el password cuando invocamos desde el CLIENTE NUSOAP OJO
if($usuario=="" and $password=="")
{
foreach($requestHeaders as $row => $innerArray)
{
foreach($innerArray as $key => $value)
{
if ($key=='username'){ $usuario=$value;}
if ($key=='password'){ $password=$value;}
}
}
}// cierra el if de $usuario=="" and $password==""
try {
//Aqui busco en la tabla de usuarios si existe el usuario y el password
$dbh1 = new PDO('pgsql:host=127.0.0.1;port=5432;dbname=Bd_Circulares;user=postgres;password=123');
$sql="Select COUNT(*) as total from usuarios a where a.usuario ="."'".trim($usuario)."'".' and a.clave='."'".trim($password)."'";
$count = $dbh1->query($sql)->fetchColumn();
if( $count >0 )
{
//Aqui me conecto a Oracle para buscar los datos del id que estoy buscando
$c=0;
$dbh = new PDO('oci:dbname=10.227.158.69:1521/FCVZP2', 'root', '123');
$sql="Select a.CUSTOMER_NAME1,a.ADDRESS_LINE1,a.COUNTRY,a.NATIONALITY from fcuv11.sttm_customer a where a.unique_id_value ="."'".$Id."'" ;
$sth = $dbh -> prepare($sql);
$sth -> execute();
foreach ($sth as $row)
{
$result[$c] = array("mensaje" => "Busqueda Exitosa","nombre" => $row['CUSTOMER_NAME1'],"direccion" => $row['ADDRESS_LINE1'],"pais"=> $row['COUNTRY'],"nacionalidad"=> $row['NATIONALITY']);
$c++;
}// cierra el foreach
if ($c==0)
{
$result[$c] = array("mensaje" => "No se encontraron datos");
} // cieer el if
}else{
$result[0] = array("mensaje" => "Fallo la validacion de username/password");
} // cierra el if $count >0
} // cierra el try
catch (PDOException $e)
{
return "Error al conectar base de datos"; exit();
}
$dbh= null;
$dbh1= null;
return $result;
}// CIERRA metodo
$server = new soap_server();
$server->configureWSDL('Servidor', 'urn:Servidor');
$server->wsdl->addComplexType(
'dataArray',
'complexType',
'array',
'',
'SOAP-ENC:Array',
array(
'mensaje' => array('mensaje' => 'mensaje', 'type' => 'xsd:string'),
'nombre' => array('nombre' => 'nombre', 'type' => 'xsd:string'),
'direccion' => array('direccion' => 'direccion', 'type' => 'xsd:string'),
'pais' => array('pais' => 'pais', 'type' => 'xsd:string'),
'nacionalidad' => array('nacionalidad' => 'nacionalidad', 'type' => 'xsd:string'),
array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:return_array_php[]')), 'tns:return_array_php'
));
$server->register(
'Consulta',
array('param_id'=>'xsd:string'),
array('return'=>'tns:dataArray'),
$namespace,
false,
'rpc',
'encoded',
'description'
);
$POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA'])? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
$server->service($POST_DATA);
?>
Veamos el resultado si el dato es encontrado en la base de datos con el usuario
y password correctos:
Veamos qué pasa si se envía un usuario o password incorrecto:
<?php
include('lib/nusoap.php');$session_header = "<UserCredentials xmlns='http://vidzapper.net/Webservice/'><username>root</username><password>xxx</password></UserCredentials>";
$client = new nusoap_client('http://10.227.158.58/ws/Servidor.php?wsdl','wsdl');
$client->soap_defencoding = 'utf-8';
$client->setHeaders($session_header);
$err = $client->getError();
if ($err) { echo 'Error en Constructor' . $err ; }
$param = array('param_id' => '12331096');
$result = $client->call('Consulta', $param);
if ($client->fault)
{
echo 'Fallo';
print_r($result);
} else { // Chequea errores
$err = $client->getError();
if ($err) { // Muestra el error
echo 'Error->' . $err ;
} else { // Muestra el resultado
echo 'Resultado';
print_r ($result);
}
}
?>