Como você exibe os dados do POST com cURL?

140

Como exemplo, POSTing para um servidor da web com o argumento -v:

curl -v http://testserver.com/post -d "firstname=john&lastname=doe"

E a saída

> POST /post HTTP/1.1
> User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3
> Host: testserver.com
> Accept: */*
> Content-Length: 28
> Content-Type: application/x-www-form-urlencoded
> 
< HTTP/1.1 200 OK
(etc)

Não há menção dos dados que publiquei.

Existe uma opção no cURL para exibir a string "firstname = john & lastname = doe" na saída?

Nota: Obviamente, a string que eu quero está no comando que eu executei, mas existem várias outras opções de postagem, como --form e --data-ascii etc. Gostaria de ver os dados brutos sendo enviados para o servidor.

gak
fonte
11
Você também pode executar o tcpdump para capturar os dados reais que estão sendo enviados ao servidor. Ou wireshark (melhor) se você tiver isso.
Keith
Eu não tenho certeza que você pode. Isso é um exemplo de segurança por obscuridade? - stackoverflow.com/questions/198462/...
slotishtype

Respostas:

176

O mais próximo que cheguei sem usar tcpdumpestá usando a --trace-asciiopção:

~ curl http://w3.org/ -d "hello=there" --trace-ascii /dev/stdout
== Info: About to connect() to w3.org port 80 (#0)
== Info:   Trying 128.30.52.45... == Info: connected
== Info: Connected to w3.org (128.30.52.45) port 80 (#0)
=> Send header, 210 bytes (0xd2)
0000: POST / HTTP/1.1
0011: User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.1
0051: 9.7 OpenSSL/0.9.8l zlib/1.2.3
0070: Host: w3.org
007e: Accept: */*
008b: Content-Length: 11
009f: Content-Type: application/x-www-form-urlencoded
00d0: 
=> Send data, 11 bytes (0xb)
0000: hello=there

Infelizmente, isso não funciona quando você está postando multipart/form-data:

~ curl http://w3.org/ -F hello=there -F testing=123 --trace-ascii /dev/stdout
== Info: About to connect() to w3.org port 80 (#0)
== Info:   Trying 128.30.52.45... == Info: connected
== Info: Connected to w3.org (128.30.52.45) port 80 (#0)
=> Send header, 270 bytes (0x10e)
0000: POST / HTTP/1.1
0011: User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.1
0051: 9.7 OpenSSL/0.9.8l zlib/1.2.3
0070: Host: w3.org
007e: Accept: */*
008b: Content-Length: 244
00a0: Expect: 100-continue
00b6: Content-Type: multipart/form-data; boundary=--------------------
00f6: --------19319e4d1b79
010c: 
<= Recv header, 32 bytes (0x20)
0000: HTTP/1.1 301 Moved Permanently
gak
fonte
4
Eu sei que é sua própria resposta, mas acho que você pode aceitar isso como a resposta correta. Ele resolveu que pelo menos para mim, graças :-)
Darren Cozinhe
4
Remova qualquer -vou --verbosecomo eles substituem a diretiva de rastreamento.
AlikElzin-kilaka 17/02/2014
2
@AugustinRiedinger Funciona bem com https. Eu apenas tentei e vi a carga útil. Os dados são criptografados, mas como você é o ponto final da conexão, você tem todos os dados disponíveis e, portanto, o curl pode vê-los.
Gak
2
Usar --trace-asciifuncionou para mim no OS X 10.8.5 Mountain Lion. Eu tenho carregado uma entidade formulário de várias com duas imagens e um corpo json e tudo funcionou como esperado
Heath Borders
4
Em vez de --trace-ascii /dev/stdoutvocê puder --trace-ascii -(traço)
Adam Michalik
27

Ou você pode testar com https://httpbin.org/

$ curl https://httpbin.org/post -d "firstname=john&lastname=doe"
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "firstname": "john", 
    "lastname": "doe"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "27", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.43.0"
  }, 
  "json": null, 
  "origin": "78.228.163.126", 
  "url": "https://httpbin.org/post"
}
Christophe Morio
fonte
12

Gostaria de adicionar a alternativa netcat

#!/bin/bash
nc -l 8080 &

curl "http://localhost:8080" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
--data @<(cat <<EOF
{
  "me": "$USER",
  "something": $(date +%s)
}
EOF
)
Gert Cuykens
fonte
9

Você poderia usar Charles e curl --proxy localhost:8888. Simples!

Dori
fonte
4
não, não funciona com https. A resposta aceita é boa e mais fácil.
Akostadinov 18/05
httpsnão era um requisito na pergunta: p
Dori
@CasparHarmer, qual é o seu problema com a resposta aceita? se você precisar de mais, o TCPdump faz o acordo.
Gewure
Isso aconteceu há 3 anos. Não me lembro.
Caspar Harmer