Como enviar POST com corpo, cabeçalhos e parâmetros HTTP usando cURL?

39

Encontrei muitos exemplos de como usar comandos POST simples no cURL, mas não encontrei exemplos de como enviar comandos HTTP POST completos, que contêm:

  • Cabeçalhos (autenticação básica)
  • Parâmetros HTTP ( s=1&r=33)
  • Dados do corpo, alguma sequência XML

Tudo o que encontrei é:

echo "this is body" | curl -d "ss=ss&qq=11" http://localhost/

Isso não funciona e envia os parâmetros HTTP como o corpo.

user71020
fonte
Parece um possível dupe de superuser.com/questions/149329/… . Sei que este é específico sobre cabeçalhos e afins, mas as respostas para a outra pergunta também tratam disso. Não costumo marcar uma pergunta popular tão antiga como uma bobagem, mas isso é uma exceção. Pode ser necessário mover algumas coisas para completar.
Michael Durrant
Na verdade, a outra resposta menciona muito especificamente --headere este não faz
Michael Durrant

Respostas:

15

Não há reputação suficiente para comentar, então deixe isso como uma resposta, esperando que ajude.

curl -L -v --post301 --post302 -i -X PUT -T "${aclfile}"  \
  -H "Date: ${dateValue}" \
  -H "Content-Type: ${contentType}" \
  -H "Authorization: AWS ${s3Key}:${signature}" \
  ${host}:${port}${resource}

Isto é o que eu usei para uma operação S3 bucket acl put. Os cabeçalhos estão em -H e o corpo, que é um arquivo xml, está em $ {aclfile} após -T. Você pode ver isso na saída:

/aaa/?acl
* About to connect() to 192.168.57.101 port 80 (#0)
*   Trying 192.168.57.101...
* Connected to 192.168.57.101 (192.168.57.101) port 80 (#0)
> PUT /aaa/?acl HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.57.101
> Accept: */*
> Date: Thu, 18 Aug 2016 08:01:44 GMT
> Content-Type: application/x-www-form-urlencoded; charset=utf-8
> Authorization: AWS WFBZ1S6SO0DZHW2LRM6U:r84lr/lPO0JCpfk5M3GRJfHdUgQ=
> Content-Length: 323
> Expect: 100-continue
>
< HTTP/1.1 100 CONTINUE
HTTP/1.1 100 CONTINUE

* We are completely uploaded and fine
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< x-amz-request-id: tx00000000000000000001f-0057b56b69-31d42-default
x-amz-request-id: tx00000000000000000001f-0057b56b69-31d42-default
< Content-Type: application/xml
Content-Type: application/xml
< Content-Length: 0
Content-Length: 0
< Date: Thu, 18 Aug 2016 08:01:45 GMT
Date: Thu, 18 Aug 2016 08:01:45 GMT

<
* Connection #0 to host 192.168.57.101 left intact

se os parâmetros de url contiverem sinais especiais como "+", use --data-urlencode para todos os parâmetros (contendo sinais especiais) deles:

curl -G -H "Accept:..." -H "..." --data-urlencode "beginTime=${time}+${zone}" --data-urlencode "endTime=${time}+${zone}" "${url}"
Tiina
fonte
57

"Parâmetros" HTTP fazem parte do URL:

"http://localhost/?name=value&othername=othervalue"

A autenticação básica tem uma opção separada, não há necessidade de criar um cabeçalho personalizado:

-u "user:password"

O "corpo" do POST pode ser enviado via --data(para application/x-www-form-urlencoded) ou --form(para multipart/form-data):

-F "foo=bar"                  # 'foo' value is 'bar'
-F "foo=<foovalue.txt"        # the specified file is sent as plain text input
-F "[email protected]"        # the specified file is sent as an attachment

-d "foo=bar"
-d "foo=<foovalue.txt"
-d "[email protected]"
-d "@entirebody.txt"          # the specified file is used as the POST body

--data-binary "@binarybody.jpg"

Então, para resumir:

curl -d "this is body" -u "user:pass" "http://localhost/?ss=ss&qq=11"
gravidade
fonte
@Emerson: Deveria ser; O módulo do PHP parece ter todas as funções que o libcurl C original possui, e o acima é uma característica bastante básica. Eu não sei a função exata a ser usada, no entanto. Se você não encontrar, pergunte no Stack Overflow.
grawity