Crear WebService En PHP

Ya hemos creado servicios web en Java, pero no habíamos visto la forma de elaborar dicho servicio en otro lenguaje, en esta ocasión usaremos php, para lograrlo, implementaremos la librería NuSoap, la cual podemos descargar desde aqui. Dado a que ya he explicado parte de la teoría de los servicios web en el ejemplo que se elaboro en java, omitiré esa parte y comenzare de inmediato a explicar el código en php. «Si deseas conocer la teoría de los webservices»–> mira este post, esta orientado a java pero dicha teoría aplica para cualquier lenguaje de programación basado en servidor.

Bien, comencemos…

Para la elaboración de este proyecto usaremos el servidor web apache junto al administrador Appserv 2.5.10, el cual puede ser descargado desde aquí.

Posteriormente descargamos la librería nusoap, luego, creamos una carpeta dentro de www (la carpeta raíz del servidor web appserv), la carpeta la llamaremos ejemplows y dentro de ella vamos a pegar la carpeta de la librería nusoap que ya habíamos descargado, dentro de dicha carpeta nusoap vienen 2 subcarpetas una llamada lib (que contiene las librería y es la que necesitamos) y la otra samples (que contiene ejemplos de ayuda, no es necesario dejarla).

Asi mismo vamos a crear 2 archivos dentro de nuestro proyecto (ejemplows), uno se llamara servicio_web.php y es el que contendrá los métodos y las definiciones que harán funcionar nuestro webservice, otro archivo llamado funciones.inc que corresponde al documento con los parámetros de conexión a una base de datos que usaremos, en la siguiente imagen se puede ver la disposición de los elementos del proyecto:

img1

Bien, ahora pasemos a la creación de la base de datos en la cual almacenaremos información procesada por el webservice, el tipo de información que se encargara de gestionar dicho servicio web será información básica de personas como cedula, nombres y apellidos, esto con el fin de poder realizar consultas y guardar datos cuando sea necesario.

inicialmente para crear la base datos abrimos el appserv y en nombre de la base de datos colocamos datos_webservice, presionamos el botón crear tal y como se ve en la imagen:

img2

luego creamos una tabla llamada datos con cuatro campos:

img3

A continuación definimos los campos id, cedula, nombre, apellidos con sus respectivos tipos de datos y longitud tal y como se observa en la siguiente imagen:

img4

Presionamos el botón grabar, y observaremos nuestra tabla creada correctamente:

img5

Listo, con esto ya tenemos la base de datos en funcionamiento, ahora pasemos a configurar el archivo funciones.inc el cual llamaremos dentro del webservice para conectarnos a la base de datos (estoy usando como editor php el programa phpDesigner, pero se pude utilizar cualquier otro).

Al abrir el archivo funciones.inc, debemos programarle lo siguiente:


Como se puede observar, este archivo contiene los parámetros para conectarnos a la base de datos, allí vemos el nombre del servidor que es localhost, el usuario de la base de datos que es root y la contraseña que es 12345, si los parámetros de conexión son correstos la funcion conectar retornara la variable $link con dichos parámetros.

después de haber configurado lo anterior ahora si podemos proceder a crear nuestro webservice, eso lo haremos en el archivo servicio_web.php, allí vamos a programar lo siguiente:


configureWSDL('miservicioweb', $miURL);  //configuramos la wsdl con el nombre de miservicioweb

$server->wsdl->schemaTargetNamespace=$miURL;

con el código anterior establecemos la configuración básica para la creación del webservice, ahora vamos a proceder a crear los métodos o funciones que comprenderán al servicio web.

primero vamos a elaborar un simple método que nos enviara una respuesta al ser invocado y asi saber que el webservice esta funcionando, para ello escribimos lo siguiente:

/*

* Ejemplo 1: Enviar_respuesta es una funcion sencilla que recibe un parametro y retorna el mismo

* con una cadena concatenada

*/

$server->register('enviar_respuesta', // Nombre de la funcion

array('parametro' => 'xsd:string'), // Parametros de entrada

array('return' => 'xsd:string'), // Parametros de salida

$miURL);

function enviar_respuesta($parametro){

return new soapval('return', 'xsd:string', 'Hola, esto lo envia el Servidor: '.$parametro);

}

Como es de notarse, primero se registra el nombre del método en la variable server para que la librería nusoap interprete dicha función como propia del webservice, luego se crea el método como tal, con sus respectivos argumentos de entrada y de salida.

Bien, después de este método vamos a crear otro que si se encargara de interactuar con la base de datos, dicho método lo llamaremos registrar_datos y su código se observa a continuación:


/*

Ejemplo 2: guardo datos que recibo de cualquier dispositivo en la base de datos

*/

$server->register('registrar_datos', // Nombre de la funcion

array('parametro' => 'xsd:string','parametro2' => 'xsd:string','parametro3' => 'xsd:string'), // Parametros de entrada

array('return' => 'xsd:string'), // Parametros de salida

$miURL);

function registrar_datos($parametro,$parametro2,$parametro3){

//recibo el dato enviado por el celular, ahora pongo un mensaje en la variable_accion

$indicador_registro="No";

include ("funciones.inc"); // llama el archivo funciones.inc donde le hace la conexion con la BD

$link =conectar(); // Se llama la funcion conectar(); que establece la conexi?n

mysql_select_db("datos_webservice", $link);//Fuci?nque seleciona la base de datos

$cad="insert into datos values ('0','$parametro','$parametro2','$parametro3')";

if($result= mysql_query ($cad, $link)) //ejecut la consulta a la base de datos

{

$indicador_registro="Si";

}

else{

print mysql_error();//Imprime un mensaje error en el caso de algun problem

}

return new soapval('return', 'xsd:string',$indicador_registro);

}

como se puede observar en dicho método registrar_datos se están recibiendo como entrada 3 parámetros que al momento de ser utilizada la función corresponderán a la cedula, nombres y apellidos de la persona que se va a registrar en la base de datos. Este metodo retorna una variable como salida indicando si el proceso de registro se efectuo correctamente.

Pasemos ahora al método buscar datos el cual servirá para determinar si algún usuario que se esta buscando a través de la cedula esta o no registrado en la base de datos, el código lo vemos a continuación:

/*

Ejemplo 3: Busco los datos a traves de la cedula que recibo como parametro

*/
$server->register('buscar_datos', // Nombre de la funcion

array('cedula' => 'xsd:string'), // Parametros de entrada

array('return' => 'xsd:string'), // Parametros de salida

$miURL);

function buscar_datos($cedula){

//recibo el dato enviado por el celular, ahora pongo un mensaje en la variable_accion

$encontro="No";

include ("funciones.inc"); // llama el archivo funciones.inc donde le hace la conexion con la BD

$link =conectar(); // Se llama la funcion conectar(); que establece la conexi?n

mysql_select_db("datos_webservice", $link);//Fuci?nque seleciona la base de datos

$recibe = "select * from datos where cedula='$cedula'";//string que almacena l aconsulta a ejecutar

$result= mysql_query ($recibe, $link);//ejecut la consulta a la base de datos

while ($f=mysql_fetch_row($result)){ // Convertimos el resultado en un vector

$encontro="Si";
}
return new soapval('return', 'xsd:string',$encontro);
}

podemos apreciar que el método buscar_datos recibe como parámetro la variable cedula para poder llevar a cabo la consulta respectiva en la base de datos, al final dicho método solo nos retornara la variable encontró indicando si dicha búsqueda tuvo efecto o no.

es conveniente indicar que este método sirve solo de verificación, para determinar si un registro existe o no al momento de implementar la consulta con el webservice. Para poder mostrar los datos que se encuentran en la base de datos asociados a esta cedula debemos crear un procedimiento o método para cada campo, es decir, necesitaremos un método llamado mostrar_datos_cedula, otro mostrar_datos_nombre y otro llamado mostrar_datos_apellido, los cuales desarrollaremos a continuación:


//############### Si los datos fueron encontrados procedo a mostrarlos independientemente ###############

// Muestro La Cedula //

$server->register('mostrar_datos_cedula', // Nombre de la funcion

array('cedula' => 'xsd:string'), // Parametros de entrada

array('return' => 'xsd:string'), // Parametros de salida

$miURL);

function mostrar_datos_cedula($cedula){

//recibo el dato enviado por el celular, ahora pongo un mensaje en la variable_accion

include ("funciones.inc"); // llama el archivo funciones.inc donde le hace la conexion con la BD

$link =conectar(); // Se llama la funcion conectar(); que establece la conexi?n

mysql_select_db("datos_webservice", $link);//Fuci?nque seleciona la base de datos

$recibe = "select * from datos where cedula='$cedula'";//string que almacena l aconsulta a ejecutar

$result= mysql_query ($recibe, $link);//ejecut la consulta a la base de datos

while ($f=mysql_fetch_row($result)){ // Convertimos el resultado en un vector

$valor_retorno= $f[1];

}

return new soapval('return', 'xsd:string',$valor_retorno);

}

//############### Si los datos fueron encontrados procedo a mostrarlos independientemente ###############

// Muestro el Nombre //

$server->register('mostrar_datos_nombre', // Nombre de la funcion

array('cedula' => 'xsd:string'), // Parametros de entrada

array('return' => 'xsd:string'), // Parametros de salida

$miURL);

function mostrar_datos_nombre($cedula){

//recibo el dato enviado por el celular, ahora pongo un mensaje en la variable_accion

include ("funciones.inc"); // llama el archivo funciones.inc donde le hace la conexion con la BD

$link =conectar(); // Se llama la funcion conectar(); que establece la conexi?n

mysql_select_db("datos_webservice", $link);//Fuci?nque seleciona la base de datos

$recibe = "select * from datos where cedula='$cedula'";//string que almacena l aconsulta a ejecutar

$result= mysql_query ($recibe, $link);//ejecut la consulta a la base de datos

while ($f=mysql_fetch_row($result)){ // Convertimos el resultado en un vector

$valor_retorno= $f[2];

}

return new soapval('return', 'xsd:string',$valor_retorno);

}

//############### Si los datos fueron encontrados procedo a mostrarlos independientemente ###############

// Muestro Los Apellidos //

$server->register('mostrar_datos_apellido', // Nombre de la funcion

array('cedula' => 'xsd:string'), // Parametros de entrada

array('return' => 'xsd:string'), // Parametros de salida

$miURL);

function mostrar_datos_apellido($cedula){

//recibo el dato enviado por el celular, ahora pongo un mensaje en la variable_accion

include ("funciones.inc"); // llama el archivo funciones.inc donde le hace la conexion con la BD

$link =conectar(); // Se llama la funcion conectar(); que establece la conexi?n

mysql_select_db("datos_webservice", $link);//Fuci?nque seleciona la base de datos

$recibe = "select * from datos where cedula='$cedula'";//string que almacena l aconsulta a ejecutar

$result= mysql_query ($recibe, $link);//ejecut la consulta a la base de datos

while ($f=mysql_fetch_row($result)){ // Convertimos el resultado en un vector

$valor_retorno= $f[3];

}

return new soapval('return', 'xsd:string',$valor_retorno);

}

Básicamente lo que hace cada uno de estos métodos es usar como parámetro de entrada la cedula de la persona a buscar en la base de datos y proceder a asignar a la variable valor_retorno el dato respectivo a cada campo de la base de datos para retornarlo en la salida del metodo del webservice; podemos probar dicho webservice escribiendo la url del servicio en el navegador.

Como el webservice lo tengo en un equipo que esta conectado en red, estoy utlizando la dirección ip para acceder a el, que en este caso es: 192.168.33.1, pero si queremos probar el webservice localmente podemos utilizar localhost o 127.0.0.1 , «hay que tener en cuenta que si el webservice se va a probar localmente también hay que colocar el termino localhost en la definición de la url del webservice»  después de invocar la librería nusoap poniendo la línea de código correspondiente de la siguiente manera:

$miURL = 'http://localhost/ejemplows';

img6

en la imagen se pueden observar los métodos que posee el webservice con dichos métodos interactuaremos con una aplicación cliente que consuma el servicio; también podemos ver la wsdl que corresponde a la serializacion en XML de los métodos que conforman nuestro webservice:

img7

Eso es todo amigos, ya tenemos listo y probado el webservice, mas adelante explicare como consumirlo desde otros programas y otros dispositivos, espero y les sea de ayuda este ejemplo. Si deseas descargar este proyecto en el siguiente link lo puedes hacer (en la carpeta va incluida el export de la base de datos).

Descargar Programa

17 comentarios en “Crear WebService En PHP

  1. Para evitar ese error

    $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA :»;
    $server->service($HTTP_RAW_POST_DATA);

  2. Yo estoy intentando consumir el servicio

    $client = new soapclient(‘http://localhost/ejemplows/servicio_web.php?wsdl’);
    $result = $client->call(‘enviar_respuesta’, array(‘parametro’ => ‘cualquier cosa’));

    y me da continuamente este error

    Fatal error: Uncaught SoapFault exception: [Client] Function («call») is not a valid method for this service in C:\wamp\www\ejemplows\cliente.php:29 Stack trace: #0 C:\wamp\www\ejemplows\cliente.php(29): SoapClient->__call(‘call’, Array) #1 C:\wamp\www\ejemplows\cliente.php(29): SoapClient->call(‘buscar_datos’, Array) #2 {main} thrown in C:\wamp\www\ejemplows\cliente.php on line 29

    ¿qué estoy haciendo mal?

  3. Creo que me he contestado yo mismo

    $client = new soapclient(‘http://www.impormovil.es/WS/servicio_web.php?wsdl’);
    $result = $client->enviar_respuesta(‘hola caracola’);
    echo «Resultado: «.$result;

  4. — Buscar.class.php
    client = new nusoap_client(«http://127.0.0.1:9999/WSEND/server.php?wsdl», true);
    }
    public function Buscar($_id){
    $response = $this->client->call(«prueba», array(«numero»=>$_id));
    return $response;
    }
    public function BuscarTotal($_id){
    $response = $this->client->call(«getfeedDetails»);
    return $response;
    }

    }
    ?>
    —- Server.php
    configureWSDL(‘server’, ‘urn:server’);
    $server ->register(‘getfeedDetails’, array(‘value’ => ‘xsd:string’), array(‘return’ => ‘xsd:Array’), ‘urn:server’, ‘urn:server# getfeedDetails’);
    $server ->register(‘prueba’, array(‘numero’ => ‘xsd:string’), array(‘return’ => ‘xsd:Array’), ‘urn:server’, ‘urn:server# prueba’);

    function getfeedDetails ()
    {
    $conn = mssql_connect(«LFIGUEREDO-PC\SQLEXPRESS», «», «»);
    mssql_select_db(«PGESTION», $conn);
    $sql = «select * from empresa_socia»;
    $q = mssql_query($sql,$conn);
    $items = array();
    while($row = mssql_fetch_array($q)){
    $items [] = array(
    ‘hd_ID_pk’=>$row[‘nombre_emp_soc’],
    ‘hd_Autorization’=>$row[‘nombre_emp_soc’],
    ‘hd_Campaing’=>$row[‘nombre_emp_soc’],
    ‘hd_RecordingCode’=>$row[‘nombre_emp_soc’]
    );
    }

    return $items;
    }

    function prueba ($id)
    {
    $conn = mssql_connect(«», «», «»);
    mssql_select_db(«PRUEBA», $conn);
    $sql = «select * from emp where id_emp = «.$id;
    $q = mssql_query($sql,$conn);
    $items = array();
    while($row = mssql_fetch_array($q)){
    $items [] = array(
    ‘hd_ID_pk’=>$row[‘nombrec’],
    ‘hd_Autorization’=>$row[‘nombrec’],
    ‘hd_Campaing’=>$row[‘nombrec’],
    ‘hd_RecordingCode’=>$row[‘nombrec’]
    );
    }

    return $items;

    }

    $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : »;
    $server->service($HTTP_RAW_POST_DATA);
    ?>
    — Buscar.js
    $(document).ready(function(){
    $(‘.tabs’).tabs({cache:false});
    $(‘.Content’).addClass(‘ui-corner-all ui-widget-content’);
    $(‘.ContentIndex’).addClass(‘ui-corner-all ui-widget-content’);
    $(‘input, select’).addClass(‘ui-widget-content ui-corner-all’);
    $(‘button’).button({‘icons’:{‘primary’:’ui-icon-find’}});
    var waitMessageInstance = null;

    $(‘#btnbuscar’).click(function(){

    $.ajax({
    type: «POST»,
    dataType:’xml’,
    url: ‘controller/BuscarController.php’,
    data: ({‘metodo’:’buscar’,
    ‘id’:$(‘#IdConsulta’).val()
    }),
    success: function(xml)
    {
    var tabla=»»;
    $(xml).find(‘datos_busqueda’).each(function(){
    tabla+= »+
    » + ($(this).attr(‘UNO’)) + ‘ ‘+
    » + ($(this).attr(‘DOS’)) + »+
    » + ($(this).attr(‘TRES’)) + »+
    » + ($(this).attr(‘CUATRO’)) + »+
    »
    });
    $(‘#tableId tbody’).children().remove();
    $(‘#tableId tbody’).append(tabla);

    },
    error:function(XMLHttpRequest, textStatus, errorThrown) {Util.errorBox(XMLHttpRequest.responseText,’Login()’);}
    });

    $.ajax({
    type: «POST»,
    dataType:’xml’,
    url: ‘controller/BuscarController.php’,
    data: ({‘metodo’:’buscarTotal’,
    ‘id’:$(‘#IdConsulta’).val()
    }),
    success: function(xml)
    {
    var tabla=»»;
    $(xml).find(‘datos_busqueda’).each(function(){
    tabla+= »+
    » + ($(this).attr(‘UNO’)) + ‘ ‘+
    » + ($(this).attr(‘DOS’)) + »+
    » + ($(this).attr(‘TRES’)) + »+
    » + ($(this).attr(‘CUATRO’)) + »+
    »
    });
    $(‘#tableIdTOTAL tbody’).children().remove();
    $(‘#tableIdTOTAL tbody’).append(tabla);

    },
    error:function(XMLHttpRequest, textStatus, errorThrown) {Util.errorBox(XMLHttpRequest.responseText,’Login()’);}
    });

    });
    });

  5. Hola… estan muy buenos los ejemplos, y practicos. mi consulta es: Como lo hago seguro ? o sea como hago para que el WS sea seguro, por ejemplo que el ingreso de datos lo haga con usuario y contraseña, si es una aplicacion privada accede cualquiera mediante el ?wsdl…. Me explico ?? no se si deberia tener un WS dentro de otro ?

    Saludos y gracias

  6. Me arroja este error soy principiante en php
    Fatal error: Call to undefined function configureWSDL() in D:\AppServ\www\ejemplows\servicio_web.php on line 2

  7. Hola, falta la configuracion a poner en el archivo de funciones, aparece vacío. ¿Pueden poner el contenido de este archivo?

    Gracias

  8. Buenos días, el código para el fichero funciones.inc no sale reflejado en la página. Además intento descargar el proyecto y no me deja. Podría poner el código que lleva el fichero funciones.inc?

    Gracias!

Deja un comentario