Cómo enviar una solicitud POST en PHP: 4 métodos comprobados

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: ¿Por qué un desarrollador PHP debe saber enviar solicitudes POST?

\n\n

Imagina esta situación: estás creando un sitio web en PHP y necesitas enviar datos a otro servidor. Por ejemplo, registrar un usuario a través de una API externa, enviar un formulario a un sistema CRM o probar tu propio manejador de solicitudes POST. Esta es una tarea clásica que todo desarrollador web enfrenta.

\n\n

La pregunta "How do I send a POST request with PHP?" en Stack Overflow ha acumulado cientos de miles de visitas. Y no es casualidad: aunque PHP es un lenguaje potente, los principiantes a menudo se confunden: ¿qué método elegir? ¿Acaso no se pueden simplemente enviar los datos?

\n\n

Sí se puede. E incluso de cuatro formas diferentes. En este artículo, analizaremos cada una, mostraremos ejemplos reales de código en PHP, compararemos el rendimiento y te diremos cuándo usar cada método. Al final del artículo, te sentirás seguro enviando solicitudes POST en cualquier proyecto.

\n\n

Método 1. El clásico: cURL (el más flexible y potente)

\n\n

cURL es una biblioteca que está presente en prácticamente todos los servidores de alojamiento. Soporta HTTPS, cookies, cabeceras, tiempos de espera y mucho más. Si necesitas enviar una solicitud POST con el máximo control, elige cURL.

\n\n

Ejemplo simple: enviar un formulario con los campos nombre y email

\n\n
<?php\n$url = 'https://api.example.com/submit';\n$data = [\n    'name' => 'Juan Pérez',\n    'email' => 'juan@example.com'\n];\n\n$ch = curl_init($url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_POST, true);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));\n// Si necesitas enviar JSON:\n// curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));\n// curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);\n\n$response = curl_exec($ch);\n$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\ncurl_close($ch);\n\nif ($httpCode === 200) {\n    echo "¡Éxito! Respuesta del servidor: " . $response;\n} else {\n    echo "Error. Código HTTP: " . $httpCode;\n}\n?>
\n\n

Detalles importantes de cURL:

\n
    \n
  • http_build_query() — convierte un array en una cadena como name=Juan&email=juan@example.com. Este es el formato estándar para formularios.
  • \n
  • curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) — para que el resultado de la solicitud se devuelva en una variable, en lugar de mostrarse directamente.
  • \n
  • Siempre verifica el código de respuesta HTTP (200 — éxito, 4xx/5xx — error).
  • \n
  • Si el servidor requiere JSON: reemplaza http_build_query por json_encode y añade la cabecera Content-Type: application/json.
  • \n
\n\n

Método 2. Rápido y sencillo: file_get_contents con contexto

\n\n

Muchos conocen file_get_contents() como una función para leer archivos. Pero pocos saben que, con Stream Context, también puede enviar solicitudes POST. Es una excelente opción si tienes una tarea simple y no quieres usar bibliotecas externas.

\n\n

Ejemplo de envío de solicitud POST con file_get_contents

\n\n
<?php\n$url = 'https://api.example.com/submit';\n$data = [\n    'name' => 'Juan Pérez',\n    'email' => 'juan@example.com'\n];\n\n$options = [\n    'http' => [\n        'header'  => "Content-Type: application/x-www-form-urlencoded\\r\\n",\n        'method'  => 'POST',\n        'content' => http_build_query($data)\n    ]\n];\n$context = stream_context_create($options);\n$result = file_get_contents($url, false, $context);\n\nif ($result === false) {\n    echo "Error al enviar la solicitud";\n} else {\n    echo "Respuesta del servidor: " . $result;\n}\n?>
\n\n

¿Cuándo usar este método?

\n
    \n
  • Cuando necesitas probar rápidamente el envío de datos.
  • \n
  • Cuando no quieres escribir mucho código con cURL.
  • \n
  • Desventaja: es difícil manejar errores (no hay acceso directo al código HTTP).
  • \n
\n

Blogs

Book Recommendations