Web services en php
Tiempo de lectura: 2 minutos
Crear un web service simple que devuelve datos en una estructura JSON
Vamos a crear un web service que, dada una url con parámetros, nos devuelva un resultado de una base de datos determinado por los parámtros de la url. El resultado tendrá el formato JSON y lo crearemos programáticamente a medida que obtengamos los datos de la consulta.
Los parámetros que necesitaremos son: la acción a llevar a cabo y el valor. En este caso serán:
Acción obtener productos -> getProd
Identificador del producto -> prod
La url final para consumir el web service quedará así:
https://photoadict.com/diet/webservice.php?action=getProd&prod=11 Conexión
Vamos al código. Primero realizaremos la conexión, dependerá del tipo de base de datos que utilicemos y una vez la tengamos, la variable $db tendrá
el handler correspondiente. En este caso es una conexióna MySQL. Nos aseguramos que el charset sea UTF-8
$db = new mysqli("host","user","password","database");
if ($db->connect_errno) {
printf("Fallo de la conexión: %s\n", $db->connect_error);
exit();
}
mysqli_set_charset($db, 'utf8'); Parámetros
Seguidamente, hacemos limpieza de los parámetros recibidos para evitar sorpresas. En el vector $clean tendremos los parámetros recibidos.
$clean = array();
foreach(array_keys($_REQUEST) as $key)
{
$clean[$key] = mysqli_real_escape_string($db, $_REQUEST[$key]);
} Cabecera
Una vez libre de errores de conexión, podemos preparar la respuesta de tipo JSON que tendrá datos o no, pero devolvemos el código 200.
header('HTTP/1.1 200 '.getStatusCodeMessage(200));
header('Content-Type: application/json; charset=utf8'); Para la descripción del código podemos prepara una funcion que nos devuelva el mensaje para adjuntarlo a la cabecera.
function getStatusCodeMessage($status) {
$codes = Array(
100 => 'Continue',
101 => 'Switching Protocols',
200 => 'OK',
201 => 'Created'
);
return (isset($codes[$status])) ? $codes[$status] : '';
} La función se puede completar con el resto de códigos del protocolo que encontrarás en el link al final del post.
- Informational responses ( 100 – 199 )
- Successful responses ( 200 – 299 )
- Redirection messages ( 300 – 399 )
- Client error responses ( 400 – 499 )
- Server error responses ( 500 – 599 )
Proceso
Ahora ya podemos empezar a procesar la consulta a la base de datos. Montaremos una variable con la salida JSON. Primero comprobamos el parámetro action para ver qué se ha pedido:
$response = "";
switch ($clean['action'])
{
case "getProd":
$response = '{ "product": [ ';
// montar la consulta
break;
} La consulta a la base de datos la montamos con un $db->prepare() para evitar SQL-injection
$sql ="select * from products where IDproduct = ?";
$stmt =$db->prepare($sql);
$stmt->bind_param("i", $clean['prod']);
$stmt->execute();
$stmt->bind_result($db_prod, $db_unit, $db_grams, $db_energy, $db_fat...);
$c = 0;
while ($stmt->fetch())
{
// preparar los datos en formato JSON
} JSON
Para montar la estructura JSON, lo que haremos es crear un registro delimitador por { } con el formato "clave":"valor" para cada campo.
if ($c) $response .=',';
$response .= '{ "grams":"'.$db_grams.'",'.
' "energy":"'.$db_energy.'",'.
' "fat":"'.$db_fat.'",'.
...
' }';
$c += 1; Utilizamos un contador para devolver el número de registros y para realizar la separación de cada grup { } con una coma.
Al finalizar el bucle de lectura, cerramos la conexión a la base de datos y nuestro data set con ] } que hemos abierto con la clave producto..
$stmt->close();
if ($c == 0) $response = '{ "response":"void" }';
else $response .= " ] } "; Resultado
Si nuestro contador de registros está a cero, la respuesta es directamente un conjunto vacío que podemos determinar o utilizar { "response":"void" }.
Una vez subido al servidor, si ejecutamos la url en un navegador y no hay errores, la respuesta ha de ser una estructura JSON
{ "product": [ { "grams":"100", "energy":"370", "fat":"16.00" } ] } que el navegador puede formatear con una extensión específica de esta manera
Código
El código completo lo encontrará en GitHub, en el enlace adjunto.
- HTTP status codes
https://developer.mozilla.org - Código
https://github.com
