Pular para o conteúdo principal

cURL para Código

cURL para código transforma um comando curl em fetch, axios, Python requests, Go, PHP ou Ruby no seu navegador. O comando é interpretado como shell — aspas simples, aspas duplas, escapes ANSI-C, continuação de linha e flags agrupadas — então um payload com espaço ou apóstrofo chega intacto.

Só local
Idioma
Comando cURL
0 B1 linhaLin. 1, Col. 1
JavaScript fetch · Qualquer navegador moderno ou Node 18+somente leitura
0 B1 linha

Como funciona o cURL para Código?

A conversão parece trivial e não é, porque um comando curl é shell, e não um formato de dados. Três coisas quebram uma implementação ingênua, e as três são comuns em comandos copiados das ferramentas de desenvolvedor de um navegador.

As aspas são a parte difícil

-d '{"name":"Ada Lovelace"}' é um único argumento que contém um espaço. -H "Authorization: Bearer $TOKEN" contém uma variável que o shell já expandiu — ou não. --data $'line\nbreak' usa citação ANSI-C, em que \n é uma quebra de linha de verdade — e os mesmos caracteres dentro de aspas simples comuns são uma barra invertida e um n literais. Nenhuma expressão regular desfaz isso, porque as regras de escape diferem dentro de cada estilo de aspas. Por isso o comando é tokenizado por uma pequena máquina de estados que acompanha dentro de quais aspas ela está, e os emissores só enxergam argumentos completos.

Flags agrupadas são três coisas diferentes

-sSL são três flags isoladas. -XPOST é uma flag com o valor colado nela. -H'X-Trace: 1' é uma flag que recebe valor, cujo valor contém pontuação e um espaço. Elas se distinguem percorrendo as letras e parando na primeira que recebe valor — que é o que o parser do próprio curl faz, e é por isso que -sSXPOST sai como um POST, e não como seis flags.

O que o código gerado se recusa a inventar

-d @payload.json lê um arquivo em tempo de execução. O arquivo não está no comando, então o corpo não pode ser embutido: o código gerado menciona o arquivo e deixa a leitura para você, porque chutar produziria código que envia em silêncio o payload errado. -k é a outra omissão deliberada — o código gerado mantém a verificação de certificados ativada e diz isso em um comentário, porque uma flag insegura copiada para a base de código é exatamente assim que ela acaba na produção.

Todo o resto traduz direto: -u vira o cabeçalho Authorization: Basic que ele de fato envia, -b vira um cabeçalho Cookie, -F vira um formulário multipart com o boundary a cargo do cliente HTTP, e -G move os dados para a query string, onde o curl os coloca.

curl

curl -X POST 'https://api.example.com/v1/orders' \
  -H 'Content-Type: application/json' \
  -d '{"total":148.5}'

fetch

const response = await fetch("https://api.example.com/v1/orders", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "total": 148.5
  }, null, 2),
});

const data = await response.json();

curl → fetch

curl

curl -X POST 'https://api.example.com/v1/orders' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_TOKEN_HERE' \
  -d '{"total":148.5}'

fetch

const response = await fetch("https://api.example.com/v1/orders", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer YOUR_API_TOKEN_HERE",
  },
  body: JSON.stringify({
    "total": 148.5
  }, null, 2),
});

const data = await response.json();

Quais opções e casos-limite o cURL para Código suporta?

Referência técnica e opções
ParâmetroTipoPadrãoComportamento e casos-limite
-X, --requestmétodoPOST se houver corpoDefine o método HTTP. Sem ela, o método é POST quando o comando tem corpo, campo de formulário ou -I, e GET nos demais casos — exatamente a regra do próprio curl.
-H, --headercabeçalhosnenhumRepetida uma vez por cabeçalho. A forma -H "Name;" remove um cabeçalho em vez de definir um; o código gerado simplesmente não o envia, e a página diz isso em vez de inventar um valor.
-d, --data*corponenhumVárias flags -d são unidas com &, que é o que o curl faz. -d @file não pode ser embutido — o arquivo não está no comando — então o código gerado o menciona pelo nome e deixa a leitura para você.
--data-urlencodecorpocodificação de formulárioO valor recebe codificação percentual antes de virar o corpo, então um espaço ou um e comercial no valor fica seguro. Esse é todo o propósito da flag.
-F, --formmultipartnenhumVira um formulário multipart. -F name=@file anexa uma parte de arquivo e -F name=value envia uma parte de texto; o boundary fica a cargo do cliente HTTP, porque definir o boundary à mão é como uma requisição multipart acaba malformada.
-u, --userautenticação básicanenhumVira o cabeçalho Authorization: Basic que o curl de fato envia, com a credencial codificada em base64. Ele aparece no código gerado porque aparecia no comando.
-b, --cookiecabeçalho CookienenhumUma string de cookies separados por ponto e vírgula vira um único cabeçalho Cookie, decomposto em pares nome/valor para que o código gerado se leia como dados, e não como uma string mágica.
-G, --getquery stringdesativadoMove todo campo -d e --data-urlencode para a query string da URL e limpa o corpo, que é como o curl emite um GET com uma lista longa de parâmetros.
-k, --insecurenotadesativadoNão é reproduzida. O código gerado verifica certificados e traz um comentário dizendo que o original não fazia isso. Copiar uma flag insegura para a base de código é assim que ela acaba na produção.
--jsoncorpo + cabeçalhosnenhumDefine o corpo, Content-Type: application/json e Accept: application/json, no mesmo esquema do atalho que o curl adicionou na versão 7.82.
-o, -m, --retry, --proxyignoradas—Caminhos de saída locais, tempos limite, contagens de repetição e configurações de proxy não têm equivalente na requisição gerada, então são consumidos e descartados em vez de traduzidos errado.
Tamanho da saídabytes256 KBUm comando é curto por natureza; o teto existe para que um arquivo colado seja recusado em vez de tokenizado.

Perguntas frequentes

Ele lida com comandos copiados do DevTools do Chrome ou do Firefox?

Sim — essa é a principal origem dos comandos que as pessoas trazem para cá. O DevTools emite argumentos entre aspas simples, uma continuação de linha com barra invertida entre eles e, com frequência, uma flag `--compressed` e um cabeçalho de cookies longo. Os três casos são tratados: a continuação é uma quebra de linha, não conteúdo; --compressed é registrado e descartado, porque cada cliente aqui negocia compressão por conta própria; e -b vira um cabeçalho Cookie.

O que acontece com -d @payload.json?

O código gerado menciona o arquivo e deixa a leitura para você completar. Não dá para embutir o conteúdo: os dados do arquivo não estão no comando, e inventar um corpo fictício produziria código que envia em silêncio o payload errado — um bug que só aparece contra uma API real. A ferramenta informa qual arquivo viu em vez de chutar.

Por que -k não é mantido?

Porque copiá-lo é justamente como uma flag insegura chega à produção. O código gerado mantém a verificação de certificados ativada e traz um comentário dizendo que o original a desativava, para que a decisão continue visível e deliberada. Se você realmente precisar dela, o comentário indica onde mudar — e no Node é uma variável de ambiente em vez de uma mudança de código.

Como variáveis de shell e caracteres escapados são tratados?

Variáveis ficam como estão escritas, porque o shell já as expandiu quando você cola o comando — um $TOKEN literal no texto significa que a variável não foi expandida, então ele permanece como um marcador visível. O escape é interpretado corretamente: dentro de aspas duplas, a barra invertida escapa apenas os cinco caracteres que o POSIX especifica; dentro de aspas simples, nada é escapado; e $'…' é citação ANSI-C, em que \n é uma quebra de linha de verdade.

Qual alvo devo escolher?

fetch se o código vai para um navegador ou para o Node 18+, que hoje é a maioria dos casos. axios quando o projeto já o usa, já que ele cuida da serialização de JSON e dos status de erro para você. Python requests para um script, Go para um serviço, PHP ou Ruby quando essa for a base de código. Os seis produzem a mesma requisição; diferem apenas na cerimônia que cada linguagem exige.

Meu comando é enviado a algum lugar?

Não. Análise e geração rodam nesta aba. Isso importa porque um comando curl frequentemente contém uma chave de API em uso, um cookie de sessão ou um token bearer — o cabeçalho Authorization do exemplo acima é exatamente isso. Nada é transmitido, e não existe rota de API para onde transmitir.