Introducción: ¿por qué necesito un cliente HTTP en PHP?
\n\nEl desarrollo web moderno es impensable sin la interacción con servicios externos. Ya sea enviar datos a una API de terceros, obtener el tipo de cambio o integrarse con una pasarela de pago, todo desarrollador PHP se enfrenta a la necesidad de realizar solicitudes HTTP. Crear un cliente HTTP confiable en PHP es una competencia básica que permite que su aplicación se comunique con el resto del mundo.
\n\nEn este artículo, analizaremos dos enfoques principales: el uso de la extensión integrada cURL y la popular biblioteca Guzzle. Aprenderá cómo enviar correctamente solicitudes GET, POST, PUT y DELETE, manejar errores y trabajar con encabezados. El material será útil tanto para principiantes como para desarrolladores experimentados que deseen sistematizar sus conocimientos.
\n\n1. Fundamentos del cliente HTTP en PHP: trabajando con cURL
\n\n1.1. ¿Qué es cURL y por qué es importante?
\n\ncURL (Client URL Library) es una potente extensión de PHP que permite interactuar con varios servidores mediante los protocolos HTTP, HTTPS, FTP y otros. Viene incluida en la distribución estándar de PHP, pero a veces requiere activación por separado en php.ini. cURL brinda control total sobre la solicitud: puede establecer cualquier método, encabezados, cuerpo de la solicitud y tiempos de espera.
\n\n1.2. Solicitud GET simple con cURL
\n\nComencemos con el escenario más común: obtener datos del servidor. Veamos un ejemplo de solicitud a la API pública JSONPlaceholder:
\n\n<?php\n// Inicialización de la sesión cURL\n$ch = curl_init('https://jsonplaceholder.typicode.com/posts/1');\n\n// Configuración de opciones\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_HTTPGET, true);\ncurl_setopt($ch, CURLOPT_TIMEOUT, 30);\n\n// Ejecución de la solicitud\n$response = curl_exec($ch);\n$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n\n// Verificación de errores\nif (curl_errno($ch)) {\n echo 'Error cURL: ' . curl_error($ch);\n} else {\n echo "Código HTTP: $httpCode\\n";\n $data = json_decode($response, true);\n print_r($data);\n}\n\n// Cierre de la sesión\ncurl_close($ch);\n?>\n\nTenga en cuenta: siempre verificamos el código de respuesta y la presencia de errores. CURLOPT_RETURNTRANSFER garantiza que el resultado se devuelva en una variable, en lugar de mostrarse directamente.
1.3. Envío de una solicitud POST con datos
\n\nPara enviar datos al servidor (por ejemplo, al crear un nuevo registro), usamos POST. Los datos se pueden transmitir como un array o una cadena JSON:
\n\n<?php\n$ch = curl_init('https://jsonplaceholder.typicode.com/posts');\n\n$postData = [\n 'title' => 'Nuevo post',\n 'body' => 'Contenido del post',\n 'userId' => 1\n];\n\ncurl_setopt_array($ch, [\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_POST => true,\n CURLOPT_POSTFIELDS => json_encode($postData), // JSON\n CURLOPT_HTTPHEADER => [\n 'Content-Type: application/json',\n 'Accept: application/json'\n ],\n CURLOPT_TIMEOUT => 30\n]);\n\n$response = curl_exec($ch);\n$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\ncurl_close($ch);\n\necho "Código HTTP: $httpCode\\n";\necho $response;\n?>\n\nPunto clave: si pasa un array en CURLOPT_POSTFIELDS, PHP lo codificará automáticamente como application/x-www-form-urlencoded. Para JSON, debe usar json_encode() e indicar explícitamente el encabezado Content-Type.
1.4. Solicitudes PUT y DELETE
\n\nPara actualizar y eliminar recursos se utilizan los métodos PUT y DELETE. En cURL, se configuran mediante la opción CURLOPT_CUSTOMREQUEST:
<?php\n// Solicitud PUT (actualización)\n$ch = curl_init('https://jsonplaceholder.typicode.com/posts/1');\n$updateData = ['title' => 'Título actualizado'];\n\ncurl_setopt_array($ch, [\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_CUSTOMREQUEST => 'PUT',\n CURLOPT_POSTFIELDS => json_encode($updateData),\n CURLOPT_HTTPHEADER =>