Esta lección está en elaboración.
Un servicio web es un programa disponible en Internet y que mediante HTTP puede recibir peticiones y entregar información.
Podemos entender un servicio web como una biblioteca de funciones remota. De la misma manera que un programa que quiere realizar una tarea hace uso de una función de una biblioteca, un programa puede recurrir a un servicio web que le proporciona el resultado de una tarea.
Las ventajas de ofrecer un servicio web son muchas: puede ser universal (si se permite el acceso abierto, cualquiera puede aprovecharlo o nosotros aprovechar servicios ya existentes), su actualización es automática (los clientes acceden siempre a la única versión disponible), es más escalable (una aplicación compleja se puede descomponer en muchos servicios web coordinados y dedicar a cada uno la infraestructura que necesite), etc.
Los servicios web también ofrecen desventajas: el retraso debido a la comunicación entre el programa y el servicio, la centralización (si el servicio es inaccesible, el programa no podría funcionar correctamente), etc.
Los siguientes ejemplos muestran la evolución desde una aplicación monolítica hasta una aplicación distribuida (con un servicio web) pasando por el uso de funciones o bibliotecas. El ejemplo es trivial y no justificaría el uso de servicios web, pero sirve como ejemplo.
<?php
// biblioteca.php
function genera_numero() {
return rand(1, 10);
}
?>
<?php
include "biblioteca.php";
$numero = genera_numero();
print " <p>Número al azar del 1 al 10 (con biblioteca): <strong>$numero</strong></p>\n";
?>
Normalmente la biblioteca y el programa se encuentran en el mismo servidor. En principio, la biblioteca podría encontrarse en otro servidor, pero en ese caso el servidor que aloje la biblioteca no realiza ningún cálculo. Los cálculos los realiza siempre el servidor en el que se encuentra el programa.
<?php
# webservice.php
print rand(1, 10);
?>
<?php
$numero = file_get_contents("http://.../webservice.php");
print " <p>Número al azar del 1 al 10 (con servicio web): <strong>$numero</strong></p>\n";
?>
Es importante señalar que:
En el ejemplo de servicio web anterior, la llamada al servicio no incluye parámetros y la respuesta es un simple dato, que no necesita ninguna estructura, pero es posible tanto enviar parámetros al servicio web como recibir datos compuestos.
En el ejemplo siguiente, se proporcionan al servicio web los límites inferior y superior entre los que el servicio elige un valor al azar:
<?php
# webservice.php
$minimo = $_REQUEST["min"];
$maximo = $_REQUEST["max"];
print rand($minimo, $maximo);
?>
<?php
$minimo = 10;
$maximo = 20;
$consulta = http_build_query(["min" => $minimo, "max" => $maximo]);
$numero = file_get_contents("http://.../webservice.php?$consulta");
print " <p>Número al azar del $minimo al $maximo (con servicio web): <strong>$numero</strong></p>\n";
?>
En el ejemplo siguiente, se proporcionan al servicio web los límites inferior y superior entre los que el servicio elige los valores al azar y la cantidad de valores a generar:
<?php
# webservice.php
$minimo = $_REQUEST["min"];
$maximo = $_REQUEST["max"];
$valores = $_REQUEST["n"];
print "[";
for ($i = 0; $i < $valores - 1; $i++) {
print rand($minimo, $maximo) . ", ";
}
print rand($minimo, $maximo);
print "]";
?>
<?php
$minimo = 10;
$maximo = 20;
$cantidad = 5;
$consulta = http_build_query(["min" => $minimo, "max" => $maximo, "n" => $cantidad]);
$numeros = json_decode(file_get_contents("http://.../webservice.php?$consulta"));
foreach ($numeros as $valor) {
print " <p>Número al azar del $minimo al $maximo (con servicio web): <strong>$valor</strong></p>\n";
}
?>