Magia de un clic: ¿cómo Postman se convierte en Curl?
\n\nTodos los que trabajan con API conocen esta situación: configuras la petición perfecta en Postman, todo funciona como un reloj, y luego necesitas pasar esa petición a un colega o integrarla en un script PHP. Haces clic en "Code" → seleccionas cURL → y obtienes el comando listo. ¿Magia? No, pura matemática y análisis sintáctico.
\n\nPero, ¿qué pasa si necesitas automatizar este proceso? ¿O escribir tu propio convertidor que transforme sobre la marcha una descripción JSON de la petición en un comando curl ejecutable? Hoy vamos a mirar bajo el capó de este mecanismo y escribiremos una función en PHP que hace exactamente lo mismo que Postman, pero con nuestras propias manos.
Este contenido será útil no solo para desarrolladores backend, sino también para todos los que quieran entender más a fondo cómo funcionan las peticiones HTTP y cómo convertirlas de un formato a otro. ¡Vamos allá!
\n\n¿Qué es realmente "Postman to Curl"?
\n\nCuando haces clic en el botón de exportación en Postman, el programa hace algo simple pero importante: toma la descripción estructurada de la petición (método, URL, cabeceras, cuerpo) y la traduce a la sintaxis de la línea de comandos.
\n\nEn esencia, se trata de una conversión de petición de una representación a otra. Postman almacena las peticiones en su modelo JSON interno. Cuando seleccionas cURL, itera sobre ese modelo y construye una cadena como esta:
\n\ncurl --request POST \\\n --url https://api.example.com/data \\\n --header 'Content-Type: application/json' \\\n --data '{"key":"value"}'\n\nTodo lo genial es simple. Pero analicemos cómo funciona esto a nivel de código.
\n\nCreando tu propio convertidor en PHP
\n\nVamos a escribir la clase PostmanToCurl, que recibe un array asociativo con los parámetros de la petición y devuelve una cadena con el comando curl listo. Será nuestro pequeño motor de conversión.
Paso 1: Definir la estructura de datos de entrada
\n\nPara simplificar, acordemos que la entrada será un array con las claves: method, url, headers (array asociativo), body (cadena o array). Este es el modelo mínimo que utiliza Postman.
<?php\n\n$request = [\n 'method' => 'POST',\n 'url' => 'https://api.example.com/users',\n 'headers' => [\n 'Content-Type' => 'application/json',\n 'Authorization' => 'Bearer token123'\n ],\n 'body' => json_encode(['name' => 'Juan', 'email' => 'juan@example.com'])\n];\n\nPaso 2: Escribir la función de ensamblaje
\n\nLa lógica principal: tomar el método, la URL, las cabeceras y el cuerpo, y unirlos en un comando. Presta atención al escape de comillas y caracteres especiales.
\n\nfunction generateCurlCommand(array $request): string {\n $parts = ['curl'];\n\n // 1. Método (si no es GET)\n if (strtoupper($request['method']) !== 'GET') {\n $parts[] = '--request ' . strtoupper($request['method']);\n }\n\n // 2. URL\n $parts[] = '--url ' . escapeshellarg($request['url']);\n\n // 3. Cabeceras\n foreach ($request['headers'] as $key => $value) {\n $parts[] = '--header ' . escapeshellarg($key . ': ' . $value);\n }\n\n // 4. Cuerpo de la petición\n if (!empty($request['body'])) {\n $parts[] = '--data ' . escapeshellarg($request['body']);\n }\n\n return implode(" \\\\\\n ", $parts);\n}\n\nLa función escapeshellarg es tu mejor amiga. Escapa correctamente las comillas, evitando que el comando se rompa y posibles inyecciones.
Análisis bajo el capó: qué hace realmente Postman
\n\nAhora que tenemos el código funcionando, analicemos cómo Postman (y nuestro convertidor) procesa cada elemento de la petición.
\n\n1. Método HTTP
\nPostman verifica si el método es diferente de GET. Si lo es, agrega la bandera --request. ¿Por qué no para GET? Porque cURL por defecto realiza una petición GET si no se especifica lo contrario. Inteligente, ¿verdad?