API en PHP: REST, GraphQL y gRPC — ¿cuál elegir en 2025?

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: Una API no es magia, es una herramienta

\n

Cuando tu sitio en PHP deja de ser una página estática y empieza a comunicarse con el mundo exterior —bots de Telegram, pasarelas de pago o tu propia app móvil—, inevitablemente te topas con las API (Application Programming Interface). Son simplemente un contrato: «Si me envías una solicitud con este formato, te devolveré los datos». Hoy en la escena PHP hay tres grandes protagonistas: el clásico REST, el flexible GraphQL y el audaz gRPC. ¿Cuál elegir? Vamos a descubrirlo con ejemplos prácticos.

\n

Este artículo está escrito para quienes ya saben programar en PHP y quieren ampliar sus horizontes. No solo copiaremos documentación, sino que analizaremos cada protocolo con la mirada de un desarrollador que resuelve problemas reales.

\n\n

API REST en PHP: el clásico comprobado

\n

REST (Representational State Transfer) no es un protocolo, sino un estilo arquitectónico. Utiliza los métodos HTTP (GET, POST, PUT, DELETE) para trabajar con recursos. Si alguna vez escribiste file_get_contents('https://api.ejemplo.com/usuarios'), ya has trabajado con REST.

\n

¿Por qué REST sigue siendo el rey?

\n
    \n
  • Simplicidad: cualquier cliente HTTP puede usarlo.
  • \n
  • Cacheo: a nivel HTTP se pueden cachear las solicitudes GET.
  • \n
  • Amplia compatibilidad: desde curl hasta librerías especializadas.
  • \n
\n

Ejemplo de cliente REST en PHP con Guzzle

\n

La librería Guzzle es el estándar de facto para peticiones HTTP en PHP. Instálala con Composer: composer require guzzlehttp/guzzle.

\n
<?php\nrequire 'vendor/autoload.php';\n\nuse GuzzleHttp\\Client;\n\n$client = new Client([\n    'base_uri' => 'https://jsonplaceholder.typicode.com/',\n    'timeout'  => 5.0,\n]);\n\n// Solicitud GET\n$response = $client->get('posts/1');\n$post = json_decode($response->getBody(), true);\necho "Título del post: " . $post['title'] . PHP_EOL;\n\n// Solicitud POST\n$response = $client->post('posts', [\n    'json' => [\n        'title' => 'Nuevo post',\n        'body' => 'Texto del post',\n        'userId' => 1\n    ]\n]);\necho "Post creado con ID: " . json_decode($response->getBody(), true)['id'];\n?>
\n

¿Qué hicimos? Simplemente enviamos peticiones HTTP. REST no requiere una librería especial —incluso puedes usar file_get_contents() con contexto—, pero Guzzle ofrece un manejo de errores cómodo, middleware y transmisión por flujos.

\n

¿Cuándo no es la mejor opción REST?

\n

Si necesitas obtener datos relacionados (por ejemplo, un post + autor + comentarios), REST te obligará a hacer varias peticiones. Aquí es donde entra en escena GraphQL.

\n\n

GraphQL en PHP: solicita solo lo que necesitas

\n

GraphQL es un lenguaje de consultas desarrollado por Facebook. El cliente describe la estructura de la respuesta. Una sola petición, una sola respuesta, sin excesos ni carencias de datos.

\n

¿Cómo funciona GraphQL en PHP?

\n

Parte del servidor: la librería webonyx/graphql-php (instalación: composer require webonyx/graphql-php). La parte del cliente es una petición HTTP POST normal con un cuerpo JSON.

\n

Ejemplo de consulta GraphQL desde PHP

\n
<?php\nrequire 'vendor/autoload.php';\n\nuse GuzzleHttp\\Client;\n\n$client = new Client(['base_uri' => 'https://countries.trevorblades.com/']);\n\n$query = '\nquery GetCountry {\n    country(code: \"RU\") {\n        name\n        capital\n        currency\n        languages {\n            name\n        }\n    }\n}';\n\n$response = $client->post('', [\n    'json' => ['query' => $query]\n]);\n\n$data = json_decode($response->getBody(), true);\necho "País: " . $data['data']['country']['name'] . PHP_EOL;\necho "Capital: " . $data['data']['country']['capital'] . PHP_EOL;\necho "Moneda: " . $data['data']['country']['currency'] . PHP_EOL;\necho "Idiomas: ";\nforeach ($data['data']['country']['languages'] as $lang) {\n    echo $lang['name'] . " ";\n}\n?>

Blogs

Book Recommendations