6. Servicios Web con PHP¶
En este tema aprenderemos a:
Entender los servicios web y su arquitectura
Consumir APIs desde PHP
Crear APIs en PHP
Está organizado en 8 talleres de unas 3 sesiones de clase. En total unas 24 sesiones de clase más tu trabajo en casa.
La dedicación depende del conocimiento previo, motivación y capacidad de aprendizaje del estudiante para esa sesión en concreto.
Video Clase
6.1. Servicios Web (W3C)¶
Video Clase
Servicios Web W3C:
Arquitectura estandarizada por el W3C (complejo)
Define los componentes, protocolos y estándares
Elementos (arquitectura SOAP):
El publicador. Describe los que hay en formato WSDL
El proveedor de servicios (Service Provider). Da el servicio solicitado por el cliente
El Consumidor (Service Consumer Proxy). Usa las funciones a través de SOAP
Ejemplo de API SOAP (WebSphere Service Registry and Repository )
La publicación es directamente en su web.
Tiene una estructura y unos tipos descritos en varios documentos WSDL
Necesitas crear un cliente SOAP en base a un WSDL
Usas las operaciones y tipos descritos:
Por ejemplo el tipo DataGraphType (que irá dentro del mensaje SOAP en algún caso)
Por ejemplo la operación retrieve (que describe la operación y el resultado)
Actividad T06-A01. Conceptos de servicios web
Revisando el material para leer, a ver si logras resolver las siguientes cuestiones:
¿Cual sería la diferencia entre servicio y protocolo?
¿Cual sería la diferencia entre protocolo y mensaje?
¿Puedes entender los componentes de un Servicio Web?
¿Qué elementos encuentras en un mensaje SOAP? Ejemplo Mensaje SOAP
¿Qué elementos encuentras en un archivo WSDL? Ejemplo Archivo WSDL
¿Cual sería uno de los ejemplos de «acciones» a desarrollar? En el archivo anterior
El archivo WSDL, ¿qué tipo de estándar utiliza?
El protocolo SOAP, ¿obliga a usar HTTP?
¿Qué diferencia ves al componente Publicación del servicio frente al proveedor?
¿Un API es obligatoriamente un servicio web?
6.2. Servicios Web API REST¶
Video Clase
Un web service es un API (pero al revés no siempre)
¿Entonces qué es un API?
Es un concepto amplio
Hay que incluir el apellido para incluir la arquitectura
Diferencia entre API y Servicio Web
No son lo mismo (pero se parecen mucho)
Uno es un caso particular de otro
El problema a resolver es el mismo: servicios interoperables, accesibles y estándar
Un par de criterios para escoger un tipo específico de API:
la dirección del recurso (múltiple o única)
lo estricto del servicio (integridad)
Ejemplos de APIs para usar en servicios web: API SOAP, API RESTful, API HTTP o p.ej. API WebSocket (P2P).
Arquitectura de Microservicios
No tiene que ver con Web Service, pero se usa como infraestructura de soporte
Arquitectura Monolítica vs Microservicios
Principio de diseño KISS : un servicio -> una tarea -> un responsable
Comunicación con APIs ligeras e independientes
Arquitectura muy flexible y escalable
En contexto web: API -> Servicio web a través de un API generalmente con arquitectura REST (API RESTful)
Arquitectura web de tipo REST (Transferencia de Estado Representacional ):
Componentes:
Protocolo C/S sin estado: basada en HTTP (Repasa bien su uso: Servicios Web (HTTP))
Respuesta en Mensaje : texto (.txt, .csv, .json) o texto con marcado (HTML / XML)
Operaciones bien definidas en base a operaciones CRUD
¶ Operación
Método HTTP
CREATE
POST
READ
GET
UPDATE
PUT
DELETE
DELETE
Direcccionamiento e Identificación estándar: URL (bueno, URI)
Plantea varias ventajas (frente a los WebService o API de SOAP):
Más flexible
Más ligera
Mejor rendimiento
Hay un móntón de APIs para desarrollar de uso público y libre
Actividad T06-A02. Investigación sencilla sobre un API
Sobre un API de ejemplo que conozcas (o busques)
¿Cual es su documentación de referencia?
¿Cual sería un ejemplo de URL a usar?
¿En qué formato devuelve las respuestas?
¿Qué tipo de operaciones permite?
¿Es de acceso libre o necesita algún tipo de clave?
¿En qué lenguaje de programación está hecha?
¿Qué servidor web utiliza?
¿Para qué te serviría a tí?
¿Qué diferencia hay entre un API Web del Navegador y un Servicio Web API REST?
6.3. Consumir el API¶
Video Clase
Un API se puede consumir de formas diferentes:
Front - End: Desde el cliente (Programacion Asíncrona con AJAX)
Back - End: Desde el Servidor
Híbrido: uso mixto según necesidades
¿Cómo lo consumes?
Consultas la documentación:
Un ejemplo sencillo: API Chuck Norris Jokes (chistes en categorías)
Uno complejo: API OpenWeather (tiempo meteorológico en una ubicación geográfica)
Cada URL/URI ofrece una funcionalidad concreta y:
Unos parámetros de entrada
Una salida (recurso de respuesta)
Consumir el API significa:
Consultar el recurso (con cualquier Cliente Web (y herramientas)) (a veces auténticándose)
Ver la respuesta. Una vez devuelta, el API se olvida del cliente (arquitectura sin estado)
Autenticación en APIs REST (necesitas consultar la documentación particular):
Pública: sin autenticación
Autenticación HTTP: basado en credenciales usuario/contraseña con métodos HTTP (básica / digest).
Basada en claves de acceso (tokens). Por ejemplo Autenticación en OpenWeather
Con clave de acceso específica
O usando una versión avanzada (típicamente usando JWT).
Uso de Autenticación (API) de terceros: OAuth por ejemplo Autenticación con Youtube
Actividad T06-A03. Probar dos ejemplos de API
Como cliente del API (Best API Clients ), que guarde en un archivo, puedes usar:
Un rastreador web (wget / curl)
Un navegador web con alguna extensión para modificar las cabeceras (de autenticación)
Un software GUI o librería de programación específica
El ejercicio consiste en hacer una prueba de consumo de las dos APIs de ejemplo. Ideal ver la respuesta en un archivo de texto (es lo que utilizarías en desarrollo).
API Chuck Norris Jokes . API pública con chistes en categorías
Consulta de un chiste aleatorio
Consulta un chiste aleatorio pero de una categoría concreta
Consulta las diferentes categorías disponibles
Consulta los chistes que contengan la palabra «spain»
API OpenWeather API privada, con autenticación con clave, para consultar el tiempo meteorológico
Crea tu clave para usar el API
Consulta el tiempo en Vigo (VGO), hoy
Consulta el tiempo en Santo Domingo (SDQ), hoy
Consulta el tiempo en Vigo (VGO), el 15 de Julio de 2021
Consulta el tiempo en Santo Domingo (SDQ), hoy, el 15 de Julio de 2021
6.4. Cliente API en PHP¶
Video Clase
Y, por concretar, se puede consumir un servicio web con php . Es decir usar php
Como cliente del API (cliente http)
Como generador de páginas web dinámicas (usando la respuesta)
Ojo a entender la secuencia (síncrona) de carga. Los pasos serían:
Uso el cliente
Lo más sencillo y rápido: function.file-get-contents
Para añadir cabeceras http hay que crear un contexto al flujo function.stream-context-create
Recojo y guardo la información
Proceso esa información (para mi página o lo que necesite)
<?php # Array con parámetros clave = valor que ... $data = array ('foo' => 'bar', 'bar' => 'baz'); # ... tienes que codifificar como url (url encoded) $data = http_build_query($data); # Y construyes la petición http, con sus cabeceras y sus datos (porque vas a usar el método POST) $context_options = array ( 'http' => array ( 'method' => 'POST', 'header'=> "Content-type: application/x-www-form-urlencoded\r\n" . "Content-Length: " . strlen($data) . "\r\n", 'content' => $data ) ); # Y creas el contexto para ese flujo (stream) concreto $context = context_create_stream($context_options) $response = file_get_contents('URL_API', false, $context); ?>
Actividad T06-A04a. Aplicación Web con un API (Ejemplo 1)
Usa PHP usando el API Chuck Norris Jokes para crear una pequeña aplicación web que:
Me muestre un chiste aleatorio (chiste, la fecha de actualización y la categoría a la que pertenece).
Que me muestre una lista de todas las categorías disponibles. La lista tiene un url para mostrar un chiste de esa categoría en concreto
Y si quiero, que me muestre un chiste aleatorio, de una búsqueda por un texto concreto (por ejemplo «spain»)
Actividad T06-A04b. Aplicación Web con un API (Ejemplo 2)
Usa PHP para generar una aplicación web sencilla que usando el API OpenWeather me muestre, para una ubicación previamente seleccionada:
El tiempo y humedad (hoy y el 15 de Julio del 2021)
Presión Atmosférica y porcentaje de nubosidad (hoy y el 15 de Julio del 2021)
Una descripción del tiempo en esa ubicación
6.5. Crear API REST en PHP¶
Video Clase
Muy usado como desarrollo servidor (back-end)
Microservicio HTTP: infraestructura fiable, de alto rendimiento y fácil de desplegar
Con la misma infraestructura se puede desplegar desde algo muy sencillo, a algo realmente complejo
Planificar tu API:
¿Qué va a hacer? Funcionalidad
¿Desde donde va a servir? EndPoint/s
¿Qué recursos va a usar? Formato de respuesta (mensajes y estado)
¿Qué operaciones va a permitir? Operaciones CRUD
¿Qué tipo de autenticación y autorización vas a utilizar?
Funciona el ciclo de desarrollo iterativo de sofware (nada sale bien a la primera)
Para crear APIs debes usar urls semánticas o amigables (sin extensión). Es decir (mapping url paths):
En vez de
http://www.miweb.com/index.php?seccion=noticias&id_noticia=133
(lo que necesita el back-end)Procesarlo a
http://www.miweb.com/noticias/133
(por ejemplo). Que es lo que ve el usuario y ofrece el servidor webEl servidor web que uses, tiene que tener un módulo de reescritura :
Activa la posibilidad de reescribir (redireccionar) un url de …
un origen (patrón, en el usario) a un destino (url a la capa de aplicación)
Actividad T06-A05a. Uso de urls amigables
Depende del servidor web que utilices, pero la funcionalidad debería ser la misma. Tres ejemplos, sobre $TU_WEB como directorio principal. Supongamos https://www.tuweb.com/apis/
$TU_WEB/noticias/133
se convierte en$TU_WEB/index.php?seccion=noticias&id_noticia=133
$TU_WEB/pedido/25/128
se convierte en$TU_WEB/pedido?id=128&categoria=25
$TU_WEB/articulo/titulo-del-articulo
se convierte en$TU_WEB/a/index?title="Título del Artículo"
Actividad T06-A05b. Crear 3 APIs sencillas con PHP
Crear un API que devuelva un color aleatorio de una lista previa (en texto utilizable como valor de color CSS). Endpoint: /api/colores . Formato texto plano
Crear un API de refranes españoles . Devolverá un refrán aleatorio, en texto puro de entre 100 escogidos previamente. Endpoint: /api/refranes . Formato texto plano
Crear un API similar al anterior, pero que devuelva tres refranes en un objeto JSON, con un campo extra que diga el orden: primero, seguro y tercero. Endpoint /api/refranes-json . Formato JSON
6.6. Añadir Funcionalidad a un API¶
Video Clase
Puedes añadir funcionalidad a un API básico:
Con parámetros en el url (similar a un formulario):
Uso un sólo programa
Puedo servir en varios urls …
… porque configuro urls semánticas en función de los parámetros
$TU_WEB/tu_api?param1=N¶m2=M -> $TU_WEB/N/M
Añado formato más complejo (por ejemplo JSON)
Puedo añadir diferentes formatos en la respuesta …
… utilizando urls semánticas y con un parámetro GET
Con la misma funcionalidad, la respuesta es la misma
$TU_WEB/tu_api?formato=csv o ... $TU_WEB/tu_api?formato=xml
Y … podría seguir, porque la complejidad podría ser:
a nivel de programación. No es lo mismo un API de refranes que un API del tiempo
No es lo mismo un API que hace un cálculo simple, que una que consulta varios almacenes de datos y diferentes servicios
Vamos a revisar un ejemplo completo, para entender:
La reescritura de urls
La simulación el envío de datos (usando valores estáticos para probar el API)
Definir la configuración básica (nombre de los scripts, textos de ayuda, etc)
Configuración de la lógica principal (puede ser algo sencillo o usar programación más compleja)
Actividad T06-A06. 3 APIs sencillas con PHP
Crea un API que devuelva el número de caracteres de una cadena de texto. Endpoint /apis/contador. Formato texto plano.
Crea un API que me devuelva el IMC de una persona (muy bien explicado aquí ). Endpoint /apis/imc/. Formato texto plano (tendrás que resolver cómo enviar los parámetros, hay diferentes opciones). Ideal en el url.
Crea un API que reciba un JSON con nombre y apellidos y devuelva un texto con el nombre completo (nombre y apellidos). EndPoint: /apis/construir-nombre . Formato texto en crudo. Aquí el problema es usar POST y la información.
6.7. API REST con POO¶
Video Clase
Uso completo de un API usando POO (Programación Orientada a Objetos con PHP)
Actividad T06-A07. API completa de gestión de usuarios
Implementar un API que permita gestionar usuarios, con un almacén en un archivo de texto.
Algunos pasos recomendados (vete paso a paso):
Crea usuarios.php para que recoja la «operación a realizar» y simplemente la escriba
Crea la clase principal Usuarios con todas las propiedades y operaciones
Definir las operaciones de lectura (R, la más sencilla)
Definir las operaciones de escritura (CUD)
Usando parámetros (GET) o …
Usando el cuerpo del mensaje (POST/PUT)
Resolver la persistencia de los datos (en principio en archivos de texto o serializando los objetos).
6.8. API RESTful¶
Video Clase
RESTful significa que cumple todas las especificaciones REST:
Un API básico suele ser simplemente leer (R)
Un API complejo (en las operaciones) implica actualizar (U), borrar (D) y crear (C) datos.
El uso de urls semánticas ya se hace imprescindible
El uso de envío de datos también:
En el cuerpo del mensaje (vía POST)
En el url (vía GET)
Y, por último, el uso de algún tipo de autenticación
Actividad T06-A08. Configurar el servidor para usar URI exclusivamente
Modificar el ejercicio de la sesión anterior para que use sólo url (y no parámetros GET)