Parser de cURL

Roda no seu navegador; nada é enviado

Leia um comando cURL como a requisição que ele envia e transforme em fetch, Python requests ou um bash organizado. Nada é enviado.

Command

No command yet

Paste a cURL command on the left, for example from your browser's developer tools (Network tab, right-click a request, Copy as cURL). Nothing is sent: the command is only read.
Ready
Ln 1, Col 1

O que é um comando cURL?

cURL é um programa de linha de comando para enviar requisições HTTP, e um comando cURL é a forma mais comum de desenvolvedores compartilharem uma requisição. Uma linha só guarda tudo o que o servidor recebe: o método depois de -X, a URL, cada header depois de -H e o body depois de -d.

Você encontra comandos cURL em todo lugar no trabalho com APIs. A documentação de APIs mostra exemplos em cURL, as ferramentas de desenvolvedor do navegador oferecem Copy as cURL em qualquer requisição de rede, e relatórios de bug muitas vezes trazem um para o problema poder ser repetido exatamente.

O curl adiciona partes da requisição que o comando não escreve, e são justamente essas que pegam as pessoas de surpresa. -d transforma um GET em POST e envia Content-Type: application/x-www-form-urlencoded, então um body JSON sem Content-Type JSON chega ao servidor como formulário. Várias opções -d são unidas com &. -G passa os dados para a query string, e -u user:password vira um header Authorization do tipo Basic. O parser mostra esses headers e marca qual opção os adicionou.

Como usar esta ferramenta

  1. 1Cole um comando no painel Command ou escolha um em Examples. Comandos copiados do Chrome ou do Firefox funcionam como estão, inclusive o Copy as cURL (cmd) do Windows com os escapes ^, e comandos do PowerShell com continuação de linha por crase.
  2. 2Veja a requisição na aba Request: o método e por que o curl o usa, a URL separada em partes, os parâmetros de query, os headers, o body (JSON é formatado sem mudar nenhum valor) e as opções que o parser lista mas não interpreta.
  3. 3As notas no topo da aba Request apontam coisas que vale saber, como um body JSON enviado como formulário. Show, ou F8, coloca o cursor na opção em questão.
  4. 4Abra a aba Code para ter a mesma requisição em JavaScript fetch, Python requests ou um comando bash organizado em várias linhas, e copie.
  5. 5Tidy (Shift+Alt+F) reescreve o comando no editor como bash, uma opção por linha. Ctrl+Z desfaz.

Solução de problemas

Aspas simples não fechadas, ou aspas duplas não fechadas
Uma aspa abre e nunca fecha, então o resto do comando é lido como um único argumento. No bash, uma aspa simples não pode aparecer dentro de '…'; escreva '\'' ou use $'…'. O editor marca onde a aspa abre.
Nenhuma URL encontrada
Todos os argumentos foram lidos como opções ou valores de opções. Confira se a URL está lá e não dentro de uma aspa não fechada, e se uma opção como -o ou -u tem o próprio valor antes da URL.
O body parece JSON, mas é enviado como formulário
-d sem Content-Type faz o curl enviar application/x-www-form-urlencoded. Adicione -H "Content-Type: application/json", ou use --json, que define Content-Type e Accept.
A URL tem [ ] ou { }
O curl trata isso como um padrão e envia várias requisições, uma para cada valor. Adicione -g (--globoff) para enviar como está escrito.
Este é um comando wget, não curl
O parser só lê curl. Um comando copiado como PowerShell no navegador usa Invoke-WebRequest; escolha Copy as cURL no lugar.

Perguntas frequentes

Meu comando é enviado para algum lugar?

Não. O comando é lido no seu navegador e nenhuma requisição é feita. Isso importa porque comandos copiados costumam ter tokens e cookies reais. O comando fica no session storage desta aba até você limpar ou fechar a aba; Copy link coloca o comando no link depois do # (nunca enviado a um servidor), então confira se há credenciais antes de compartilhar.

Quais opções do cURL o parser entende?

As que mudam a requisição: -X, -H, -d e suas variantes (--data-raw, --data-binary, --data-urlencode), --json, -F, -G, -I, -T, -u, -b, -A, -e, --oauth2-bearer, -L, -k, -m e --compressed. Opções curtas podem ser combinadas, como em -sSL, ou ter o valor colado, como em -XPOST. Outras opções são listadas com o que fazem, e as desconhecidas também aparecem em vez de serem descartadas.

Por que aparece POST se meu comando não tem -X?

O curl envia um POST sempre que o comando tem body (-d, --json ou -F) e nenhum método explícito, e o parser segue a mesma regra. -G envia os dados como query string com GET, e -I envia HEAD.

Ele lê arquivos referenciados com @, como -d @body.json?

Não. O parser roda no navegador e não consegue ler arquivos do seu computador, então mostra o nome do arquivo e uma nota. Cole o conteúdo do arquivo com --data-raw para ver o body.

Quão exato é o código gerado?

O método, a URL, os headers e o body são os mesmos, e o body é enviado como a mesma string, sem ser recodificado. Algumas opções do curl não têm equivalente: o fetch não consegue pular a verificação de certificado como o -k, e os navegadores não deixam o fetch definir um header Cookie. O código gerado avisa isso num comentário onde importa. O código Python passa allow_redirects=False, a menos que o comando tenha -L, porque o curl não segue redirecionamentos por padrão.