Web Service

Un Web Service es una tecnología que usa un conjunto de protocolos estándar basado en texto, que permite intercambiar datos entre aplicaciones desarrolladas en lenguajes diferentes usando internet. No están ligados a ningún sistema operativo o lenguaje de programación. Incluso se puede usar desde aparatos tan sencillos como Arduino.

Arduino <--> PHP <--> MySQL

La principal razón para usar servicios Web es que se pueden usar con HTTP sobre TCP en el puerto 80, al igual que cualquier navegador web. Otra razón es porque los servicios Web pueden aportar gran independencia entre la aplicación que usan el servicio.

1. HTTP

El HTTP (Hipertext Transfer Protocol) es un protocolo de comunicaciones que permite la transferencia de recursos entre equipos conectados a una red. El equipo que hará la petición o recepción de los datos se llama CLIENTE y el que aloja los datos se llama SERVIDOR. Es mediante el URL (Uniform Resource Locator) que podemos hacer esta tarea.

URL = servidor.com/prueba/datos.php

2. JSON

JSON (JavaScript Object Notation) es un estandar basado en texto plano usado para el intercambio de información entre dos sistemas que no necesariamente comparten el mismo lenguaje.

Funciones JSON disponibles
FunciónDescripción
json_encoce()Retorna la representación JSON del valor dado codificado en UTF-8
json_decode()Decodifica un string de JSON
json_last_errorDevuelve el último error que ocurrió
jsn_last_error_msgDevuelve el string con el error de la última llamada a json_encode() o a json_decode()
Android <--> PHP

2.1 Codificar

Función que devolverá una cadena JSON en caso de éxito o FALSE en caso de error. La variable puede ser una matriz o un objeto. Si es una matriz no asociativa empezara de 0, si es asociativa usara la clave asignada.

$json = json_encode($val[, $op=0[, $dep=512]]);
Donde:
$val --> cadena a ser codificada. Debe ser tipo UTF-8
$op --> comportamiendo
$dep --> Profundidad maxima. Por default 128.

Si estas pasando datos de PHP a Javascript asegura de iniciar con header('Content-Type: application/json');

$val = array(54,'Juan','Elite');
//Desde PHP 5.4
$val = [54,'Juan','Elite'];
echo json_encode($val); //{0:54,1:'Juan',2:'Elite'}

Si usaras caracteres UTF-8 especiales deberás usar las funciones array_Map('htmlentities',$val) y html_entity_decode(json_encode($val)).

$val = array('num'=>54,'nom'=>'Juan','cat'=>'Elite');
//Desde PHP 5.4
$val = ['num'=>54,'nom'=>'Juan','cat'=>'Elite'];
echo json_encode($val); //{'num':54,'nom':'Juan','cat':'Elite'}

2.2 Decodificar

Convierte una cadena codificado en JSON a una variable de PHP. NULL es devuelto si el parámetro json no se puede decodificar o si los datos codificados son más profundos que el límite de recursividad.

El nombre y el valor deben estar entre comillas dobles, las comillas simples no son válidas. Las comas finales no están permitidas.

$val = json_decode($json[, $assoc=true[, $dep=512[, $op=0]]]);
Donde:
$json --> cadena a ser decodificada. Debe ser tipo UTF-8
$assoc --> True devuelve una matriz asociativa.
$dep --> Profundidad máxima. Por default 128.
$op --> comportamiento
$json = '{"num":54,"nom':"Juan","cat":"Elite"}';
var_dump(json_decode($json));
//tambien puedes
$obj = json_decode($json);
echo $obj->{'num'}: //54
$json = file_get_contents($url);
$json = utf8_encode($json);
var_dump(json_decode($json));
//tambien puedes
$obj = json_decode($json);
echo $obj->{'num'}: //54

Errores devueltos por json_last_error()
ErrorDescripción
JSON_ERROR_NONE()No ha ocurrido ningún error.
JSON_ERROR_DEPTH()Se ha excedido la profundidad máxima de la pila.
JSON_ERROR_STATE_MISMATCH()Por desbordamiento de buffer o cuando los modos no coinciden.
JSON_ERROR_CTRL_CHAR()Error del carácter de control, posiblemente se ha codificado de forma incorrecta.
JSON_ERROR_SYNTAX()Error de sintaxis.
JSON_ERROR_UTF8()Caracteres UTF-8 mal formados, posiblemente codificados incorrectamente.
JSON_ERROR_RECURSION()El objeto o array pasado a json_encode() incluye referencias recursivas y no se puede codificar. Si se proporcionó la opción JSON_PARTIAL_OUTPUT_ON_ERROR, se codificará NULL en el lugar de la referencia recursiva.
JSON_ERROR_INF_OR_NAN()El valor pasado a json_encode() incluye NAN o INF. Si se proporcionó la opción JSON_PARTIAL_OUTPUT_ON_ERROR, se codificará 0 en el lugar de estos números especiales.
JSON_ERROR_UNSUPPORTED_TYPE()Se proporcionó un valor de un tipo no admitido para json_encode(), tal como un resource. Si se proporcionó la opción JSON_PARTIAL_OUTPUT_ON_ERROR, se codificará NULL en el lugar del valor no admitido.

3. Validar

El CLIENTE (Arduino por ejemplo) debería enviar la URL y los parámetros, estos son recogidos por PHP, consulta MySQL y responde con un JSON.

localhost/webservice/valida.php?user=kike&clave=123
$user = $_RESQUESR['user'];
$clave = $_RESQUESR['clave'];
$sql = "SELECT * FROM alumnos WHERE user=$user and clave=$clave";

foreach ($res as $row){
	$datos[] = $row;
}
echo json_encoder($datos);