GUZZLE EN PHP: TUTORIAL PARA REALIZAR PETICIONES HTTP

Guzzle es una librería de PHP que funciona como cliente HTTP. Básicamente permite hacer peticiones a cualquier servidor web (GET, POST, PUT, DELETE, etc.) de forma súper sencilla, limpia y potente. Es una de las librerías más usadas en PHP (especialmente en Laravel, Symfony, WordPress plugins, APIs, etc.).

¿Para qué sirve?

  • Consumir APIs externas (JSON, XML, etc.).
  • Subir archivos.
  • Manejar autenticación (Basic, Digest, OAuth2, Bearer tokens).
  • Enviar peticiones asíncronas (con promises).
  • Manejar cookies, headers, timeouts, redirecciones.
  • Depurar fácilmente (middleware de logging).

Instalación

Guzzle se instala de forma sencilla con el comando de Composer:

composer require guzzlehttp/guzzle

Ejemplo

  • Ejemplo petición GET

    require 'vendor/autoload.php';
    
    use GuzzleHttp\Client;
    
    $client = new Client();
    
    $response = $client->get('https://jsonplaceholder.typicode.com/posts/1');
    
    echo $response->getStatusCode(); // 200
    echo $response->getBody();  // el JSON completo
    
    O también se puede hacer:

    require 'vendor/autoload.php';
    
    use GuzzleHttp\Client;
    
    $client = new Client();
    
    $response = $client->get('https://api.example.com/users', [
        'query' => [
       'page' => 1,
       'limit' => 10
        ]
    ]);
    
    echo $response->getStatusCode(); // 200
    echo $response->getBody();  // el JSON completo
    
  • Ejemplo petición POST:

    require 'vendor/autoload.php';
    
    use GuzzleHttp\Client;
    
    $client = new Client();
    
    $response = $client->post('https://api.ejemplo.com/users', [
        'json' => [
       'name' => 'Juan',
       'email' => 'juan@example.com'
        ]
    ]);
    
    echo $response->getStatusCode(); // 200
    echo $response->getBody();  // el JSON completo
    
    Con respecto al ejemplo del POST. Ha que hacer lo siguiente donde se recibe la petición para obtener los POST enviados:

    
    header('Content-Type: application/json'); // opcional
    
    // Leer el cuerpo raw de la petición
    $rawInput = file_get_contents('php://input');
    
    // Convertir JSON a array
    $data = json_decode($rawInput, true);
    
    if ($data === null) {
        http_response_code(400);
        echo json_encode(['error' => 'JSON inválido']);
        exit;
    }
    
    // Ahora tienes los datos exactamente como los enviaste
    $name  = $data['name']  ?? null;
    $email = $data['email'] ?? null;
    
    echo json_encode([
        'recibido' => true,
        'nombre'   => $name,
        'email'    => $email
    ]);
    
    En este caso se usa json porque la llamada se hace con json.
  • Enviar formulario:

    require 'vendor/autoload.php';
    
    use GuzzleHttp\Client;
    
    $client = new Client();
    
    $response = $client->post('https://api.ejemplo.com/users', [
        'form_params' => [      // ← Esto simula <form method="post">
       'nombre' => 'María García',
       'email'  => 'maria@example.com',
       'password'    => 'secreto123',
       'telefono'    => '612345678',
       'acepto' => '1'
        ]
    ]);
    
    $status = $response->getStatusCode();
    $body   = $response->getBody()->getContents();
    
  • Enviar formulario con ficheros:

    require 'vendor/autoload.php';
    
    use GuzzleHttp\Client;
    
    use GuzzleHttp\Psr7\Utils;   // ← importante para archivos grandes
    
    $client = new Client();
    $response = $client->post('https://api.ejemplo.com/users', [
        'multipart' => [
       [
      'name'     => 'file',
      'contents' => Utils::tryFopen('fileToUpload', 'r'), //Se ùede usar fopen normal de php
      'filename' => 'fileUploaded.txt',
       ],
       // Xampos normales (no archivos)
       [
      'name'     => 'usuario',
      'contents' => 'Juan123'
       ],
       [
      'name'     => 'descripcion',
      'contents' => 'Este es un archivo de prueba'
       ]
        ],
        'headers' => [
       'Authorization' => 'Bearer tu-token-aqui',   // si hace falta
       'Accept'   => 'application/json'
        ]
    ]);
    
    $body = (string) $response->getBody();
    echo 'Archivo enviado correctamente!
    '; echo 'Respuesta del servidor: ' . $body;
    En el servidor hay que hacer como cuando se suben fichero normales de un formulario:

    // 1. Crear carpeta si no existe
    $uploadDir = __DIR__ . '/uploads/';
    if (!is_dir($uploadDir)) {
        mkdir($uploadDir, 0755, true);
    }
    
    // 2. Verificar que llegó el archivo
    if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) {
    
        $nombreOriginal = $_FILES['file']['name'];
        $tmpName   = $_FILES['file']['tmp_name'];
    
        // Puedes cambiar el nombre o ponerle timestamp para evitar sobreescribir
        $nuevoNombre = date('Ymd_His_') . basename($nombreOriginal);
        $rutaFinal   = $uploadDir . $nuevoNombre;
    
        // 3. Guardar el archivo
        if (move_uploaded_file($tmpName, $rutaFinal)) {
       
       echo json_encode([
      'status'  => 'success',
      'message' => 'Archivo guardado correctamente',
      'archivo' => $nuevoNombre,
      'ruta'    => '/uploads/' . $nuevoNombre,
      'tamaño'  => $_FILES['file']['size'] . ' bytes'
       ]);
    
       // También puedes leer otros campos enviados
       $usuario = $_POST['usuario'] ?? 'desconocido';
       echo "\nUsuario recibido: " . $usuario;
    
        } else {
       http_response_code(500);
       echo json_encode(['status' => 'error', 'message' => 'No se pudo guardar el archivo']);
        }
    
    } else {
        http_response_code(400);
        echo json_encode([
       'status' => 'error',
       'message' => 'No se recibió ningún archivo o hubo error',
       'error_code' => $_FILES['file']['error'] ?? 'ninguno'
        ]);
    }
    
  • Peticiones asíncronas:

    require 'vendor/autoload.php';
    
    use GuzzleHttp\Client;
    
    $client = new Client();
    
    $promise = $client->getAsync('https://api.example.com/users', [
        'headers' => [
       'Accept' => 'application/json',
       'Authorization' => 'Bearer tu-token'
        ],
        'query' => ['page' => 1, 'limit' => 10]   // parámetros GET
    ]);
    
    $response = $promise->wait();       // ← aquí espera la respuesta
    
    $body = (string) $response->getBody();
    $data = json_decode($body, true);
    
    echo "Éxito! Código: " . $response->getStatusCode() . "\n";
    print_r($data);
    
  • "$response->getStatusCode()": Devuelve el código de estado HTTP como número entero. Ejemplos comunes:
    • 200 → OK (todo bien).
    • 201 → Created (recurso creado).
    • 400 → Bad Request (error en los datos que enviaste).
    • 401 → Unauthorized (falta login).
    • 404 → Not Found.
    • 500 → Error del servidor.
  • "$response->getBody()": Devuelve el cuerpo (el contenido) de la respuesta. Es un stream.

¿Por qué es tan popular?