A mágica de um clique: como o Postman se transforma em Curl?
\n\nQuem já trabalhou com API conhece esta situação: você configura a requisição perfeita no Postman, tudo funciona como um relógio, e então precisa passar essa requisição para um colega ou incorporá-la em um script PHP. Você clica em "Code" → seleciona cURL → e pronto, recebe o comando pronto. Mágica? Não, é pura matemática e parsing.
\n\nMas e se você precisar automatizar esse processo? Ou criar seu próprio conversor que transforme uma descrição JSON da requisição em um comando curl executável? Hoje vamos mergulhar nos bastidores desse mecanismo e escrever uma função em PHP que faz exatamente o que o Postman faz — só que com as próprias mãos.
Este conteúdo será útil não apenas para desenvolvedores backend, mas para todos que desejam entender melhor como funcionam as requisições HTTP e como convertê-las de um formato para outro. Vamos nessa!
\n\nO que é "Postman to Curl" na prática?
\n\nQuando você clica no botão de exportação no Postman, o programa faz algo simples, porém importante: ele pega a descrição estruturada da requisição (método, URL, cabeçalhos, corpo) e a traduz para a sintaxe da linha de comando.
\n\nBasicamente, é uma conversão de requisição de uma representação para outra. O Postman armazena as requisições em seu modelo JSON interno. Quando você seleciona cURL, ele itera sobre esse modelo e monta uma string como esta:
\n\ncurl --request POST \\\n --url https://api.example.com/data \\\n --header 'Content-Type: application/json' \\\n --data '{"key":"value"}'\n\nTudo que é genial é simples. Mas vamos analisar como isso funciona no nível do código.
\n\nCriando seu próprio conversor em PHP
\n\nVamos escrever a classe PostmanToCurl, que recebe um array associativo com os parâmetros da requisição e retorna uma string com o comando curl pronto. Este será nosso mini-motor de conversão.
Passo 1: Definindo a estrutura dos dados de entrada
\n\nPara simplificar, vamos combinar que a entrada será um array com as chaves: method, url, headers (array associativo), body (string ou array). Este é o modelo mínimo que o Postman utiliza.
<?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' => 'João', 'email' => 'joao@example.com'])\n];\n\nPasso 2: Escrevendo a função de montagem
\n\nA lógica principal: pegar o método, URL, cabeçalhos e corpo — e juntá-los em um comando. Preste atenção ao escape de aspas e caracteres especiais.
\n\nfunction generateCurlCommand(array $request): string {\n $parts = ['curl'];\n\n // 1. Método (se não for 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. Cabeçalhos\n foreach ($request['headers'] as $key => $value) {\n $parts[] = '--header ' . escapeshellarg($key . ': ' . $value);\n }\n\n // 4. Corpo da requisição\n if (!empty($request['body'])) {\n $parts[] = '--data ' . escapeshellarg($request['body']);\n }\n\n return implode(" \\\\\\n ", $parts);\n}\n\nA função escapeshellarg é sua melhor amiga. Ela escapa corretamente as aspas, evitando quebra do comando e possíveis injeções.
Análise dos bastidores: o que o Postman realmente faz
\n\nAgora que temos um código funcional, vamos analisar como exatamente o Postman (e nosso conversor) processa cada elemento da requisição.
\n\n1. Método HTTP
\nO Postman verifica se o método é diferente de GET. Se sim, adiciona a flag --request. Por que não para GET? Porque o cURL faz uma requisição GET por padrão, a menos que especificado de outra forma. Inteligente, não?