APIs con PHP

Consumo de APIs con PHP

Objetivos de Aprendizaje
  • Aprender a consumir APIs externas con PHP
  • Utilizar diferentes métodos para realizar peticiones HTTP
  • Procesar respuestas JSON de APIs
  • Manejar errores y excepciones en peticiones API
  • Implementar autenticación API con PHP

Métodos para consumir APIs en PHP

PHP ofrece varias formas de realizar peticiones HTTP a APIs externas. Veamos las más utilizadas:

file_get_contents()

  • Función nativa de PHP
  • Simple para peticiones GET
  • Limitado para peticiones complejas
  • Requiere allow_url_fopen=On

cURL

  • Más potente y flexible
  • Soporta todos los métodos HTTP
  • Permite configuración avanzada
  • Requiere extensión cURL instalada

Bibliotecas

  • Guzzle HTTP Client
  • Symfony HTTP Client
  • Más abstraídas y fáciles de usar
  • Instalables con Composer

Ejemplos prácticos

1. Usando file_get_contents()

Método simple para peticiones GET a una API:

ejemplo_file_get_contents.php

<?php
// URL de la API (en este caso una API pública de prueba)
$url = "https://jsonplaceholder.typicode.com/users/1";

// Configuración del contexto para la petición
$options = [
    "http" => [
        "method" => "GET",
        "header" => "Content-Type: application/json\r\n" .
                   "Accept: application/json\r\n"
    ]
];

$context = stream_context_create($options);

try {
    // Realizar la petición
    $response = file_get_contents($url, false, $context);
    
    // Decodificar la respuesta JSON
    $data = json_decode($response, true);
    
    // Mostrar los datos
    echo "Nombre: " . $data['name'] . "<br>";
    echo "Email: " . $data['email'] . "<br>";
    echo "Teléfono: " . $data['phone'] . "<br>";
    
} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}
?>

2. Usando cURL

cURL ofrece más flexibilidad y opciones para realizar peticiones HTTP:

ejemplo_curl.php

<?php
// URL de la API
$url = "https://jsonplaceholder.typicode.com/posts";

// Datos a enviar (para un POST)
$data = [
    'title' => 'Nuevo post',
    'body' => 'Contenido del post',
    'userId' => 1
];

// Inicializar cURL
$ch = curl_init($url);

// Configurar opciones de cURL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Devolver respuesta como string
curl_setopt($ch, CURLOPT_POST, true); // Método POST
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); // Datos a enviar
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Accept: application/json'
]);

// Ejecutar la petición
$response = curl_exec($ch);

// Verificar si hay errores
if (curl_errno($ch)) {
    echo 'Error cURL: ' . curl_error($ch);
    exit;
}

// Obtener código de estado HTTP
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// Cerrar sesión cURL
curl_close($ch);

// Procesar la respuesta
echo "Código HTTP: " . $httpCode . "<br>";

if ($httpCode == 201 || $httpCode == 200) {
    $data = json_decode($response, true);
    echo "Post creado con ID: " . $data['id'] . "<br>";
    echo "Título: " . $data['title'] . "<br>";
} else {
    echo "Error en la petición. Código: " . $httpCode;
}
?>

3. Consumiendo nuestra API de usuarios

Ejemplo de cómo consumir la API de usuarios que desarrollaremos en la próxima sección:

consumir_api_usuarios.php

<?php
// URL base de nuestra API
$baseUrl = "http://localhost/api/usuarios";

/**
 * Función para realizar peticiones a la API
 * @param string $url URL de la petición
 * @param string $method Método HTTP (GET, POST, PUT, DELETE)
 * @param array $data Datos a enviar (para POST, PUT)
 * @return array Respuesta decodificada
 */
function llamarAPI($url, $method = 'GET', $data = null) {
    $ch = curl_init($url);
    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
    
    if ($data && ($method === 'POST' || $method === 'PUT')) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    }
    
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'Accept: application/json'
    ]);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    curl_close($ch);
    
    return [
        'codigo' => $httpCode,
        'datos' => json_decode($response, true)
    ];
}

// 1. Obtener todos los usuarios
echo "<h3>Lista de usuarios</h3>";
$usuarios = llamarAPI($baseUrl);

if ($usuarios['codigo'] == 200) {
    echo "<ul>";
    foreach ($usuarios['datos'] as $usuario) {
        echo "<li>" . $usuario['nombre'] . " - " . $usuario['correo'] . "</li>";
    }
    echo "</ul>";
} else {
    echo "Error al obtener usuarios. Código: " . $usuarios['codigo'];
}

// 2. Crear un nuevo usuario
echo "<h3>Crear nuevo usuario</h3>";
$nuevoUsuario = [
    'nombre' => 'Carlos Gómez',
    'correo' => 'carlos@example.com'
];

$resultado = llamarAPI($baseUrl, 'POST', $nuevoUsuario);

if ($resultado['codigo'] == 201) {
    echo "Usuario creado correctamente: " . $resultado['datos']['mensaje'];
} else {
    echo "Error al crear usuario. Código: " . $resultado['codigo'];
}

// 3. Obtener un usuario específico
$idUsuario = 1;
echo "<h3>Detalle del usuario $idUsuario</h3>";
$usuario = llamarAPI($baseUrl . "/" . $idUsuario);

if ($usuario['codigo'] == 200) {
    echo "ID: " . $usuario['datos']['id'] . "<br>";
    echo "Nombre: " . $usuario['datos']['nombre'] . "<br>";
    echo "Email: " . $usuario['datos']['correo'] . "<br>";
} else {
    echo "Error al obtener el usuario. Código: " . $usuario['codigo'];
}
?>

Manejo de errores y excepciones

Es importante implementar un manejo adecuado de errores al consumir APIs:

Buenas prácticas para manejo de errores
  • Verifica los códigos de estado HTTP de la respuesta
  • Utiliza bloques try-catch para capturar excepciones
  • Valida el formato de la respuesta antes de intentar procesarla
  • Establece tiempos de espera (timeout) adecuados para evitar bloqueos
  • Implementa reintentos con backoff exponencial para peticiones fallidas
  • Registra (log) los errores para depuración

Autenticación al consumir APIs

Muchas APIs requieren autenticación. Estos son los métodos más comunes:

Método Descripción Implementación
API Key Clave única que identifica al cliente Se pasa en el header o como parámetro de URL
Basic Auth Combinación de usuario y contraseña Se codifica en Base64 y se envía en el header Authorization
OAuth 2.0 Protocolo estándar de autorización Se obtiene un token de acceso que se pasa en el header
JWT Token seguro que contiene información del usuario Se envía en el header Authorization
autenticacion_api.php

<?php
// Ejemplo con API Key
function apiKeyRequest($url, $apiKey) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "X-API-Key: $apiKey",
        'Accept: application/json'
    ]);
    $response = curl_exec($ch);
    curl_close($ch);
    return json_decode($response, true);
}

// Ejemplo con Basic Auth
function basicAuthRequest($url, $username, $password) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
    $response = curl_exec($ch);
    curl_close($ch);
    return json_decode($response, true);
}

// Ejemplo con Bearer Token (JWT o OAuth)
function tokenRequest($url, $token) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "Authorization: Bearer $token",
        'Accept: application/json'
    ]);
    $response = curl_exec($ch);
    curl_close($ch);
    return json_decode($response, true);
}
?>
En resumen

PHP ofrece varias formas de consumir APIs externas, desde funciones nativas como file_get_contents y cURL, hasta bibliotecas especializadas. Es importante manejar adecuadamente los errores, validar las respuestas y aplicar los métodos de autenticación requeridos. En la siguiente lección, veremos cómo crear nuestras propias APIs con PHP.