PHP ofrece varias formas de realizar peticiones HTTP a APIs externas. Veamos las más utilizadas:
Método simple para peticiones GET a una API:
<?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();
}
?>
cURL ofrece más flexibilidad y opciones para realizar peticiones HTTP:
<?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;
}
?>
Ejemplo de cómo consumir la API de usuarios que desarrollaremos en la próxima sección:
<?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'];
}
?>
Es importante implementar un manejo adecuado de errores 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 |
<?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);
}
?>
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.