Como enviar um cabeçalho usando uma solicitação HTTP por meio de uma chamada de curl?

1448

Desejo enviar um cabeçalho para o meu servidor Apache em uma caixa Linux. Como conseguir isso por meio de uma chamada de onda?

gagneet
fonte
60
Há uma boa maneira de aprender como usar o curl para solicitações http por exemplos. Faça o download da versão mais recente do Postman, faça qualquer configuração de solicitação http conforme desejado no nível da interface do usuário (publique, coloque, obtenha ... por exemplo, com cabeçalhos e corpo do json) e clique em "gerar código" e escolha a opção "curl" . Dá a você a linha de comando equivalente.
Vinicius Lima

Respostas:

513

PEGUE:

com JSON:

curl -i -H "Accept: application/json" -H "Content-Type: application/json" http://hostname/resource

com XML:

curl -H "Accept: application/xml" -H "Content-Type: application/xml" -X GET http://hostname/resource

POSTAR:

Para lançar dados:

curl --data "param1=value1&param2=value2" http://hostname/resource

Para upload de arquivo:

curl --form "[email protected]" http://hostname/resource

Postagem HTTP RESTful:

curl -X POST -d @filename http://hostname/resource

Para fazer login em um site (autenticação):

curl -d "username=admin&password=admin&submit=Login" --dump-header headers http://localhost/Login
curl -L -b headers http://localhost/
Randhi Rupesh
fonte
o que significa @filename para a publicação RESTful? você está postando um arquivo em um servidor REST? que parece estranho para mim
JesseBoyd
6
Para quem chega mais tarde e pode estar se perguntando a mesma coisa ... a notação @ é uma maneira de ler os dados a serem enviados ao servidor a partir de um arquivo, em vez de inseri-los na solicitação de curl. Você não POST um arquivo por si só, você está postando o conteúdo do arquivo como o corpo da sua solicitação POST.
F1dave
Resposta mais detalhada aqui: stackoverflow.com/questions/14978411/… :)
Amith Koujalgi
1983

man curl:

   -H/--header <header>
          (HTTP)  Extra header to use when getting a web page. You may specify
          any number of extra headers. Note that if you should  add  a  custom
          header that has the same name as one of the internal ones curl would
          use, your externally set header will be used instead of the internal
          one.  This  allows  you  to make even trickier stuff than curl would
          normally do. You should not replace internally set  headers  without
          knowing  perfectly well what you're doing. Remove an internal header
          by giving a replacement without content on the  right  side  of  the
          colon, as in: -H "Host:".

          curl  will  make sure that each header you add/replace get sent with
          the proper end of line marker, you should thus not  add  that  as  a
          part  of the header content: do not add newlines or carriage returns
          they will only mess things up for you.

          See also the -A/--user-agent and -e/--referer options.

          This option can be used multiple times to add/replace/remove  multi-
          ple headers.

Exemplo:

curl --header "X-MyHeader: 123" www.google.com

Você pode ver a solicitação que a onda enviou adicionando a -vopção

Tader
fonte
74
Se você quiser enviar vários cabeçalhos usando mais de um cabeçalho, tudo bem, o curl analisará cada um como um cabeçalho diferente. Não há como separar cabeçalhos dentro do mesmo parâmetro --header. exemplo: curl --header "Accept: javascript" --header "test: hello" -v www.google.com
Hatoru Hansou
2
Se as pessoas querem exemplos eu vou deixar isso aqui: bropages.org
Peter Westmacott
As páginas do manual (no OSX, pelo menos) agora incluem um exemplo: Exemplo: # curl -H "Nome próprio X: Joe" 192.168.0.1
JESii 6/17
6
@ MartinKonicek e outros: Eu recomendo o utilitário tldr (brew, etc install tldr). São apenas exemplos. por exemplo "- Envie uma solicitação com um cabeçalho extra, usando um método HTTP personalizado: curl -H 'X-My-Header: 123' -X PUT example.com "
280

Em PHP :

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName:HeaderValue'));

ou você pode definir vários:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName:HeaderValue', 'HeaderName2:HeaderValue2'));
James
fonte
1
@ James funciona bem em alguns casos, mas em outros o CURL envia um cabeçalho adicional "Expect: 100-continue" - alguma idéia de como removê-lo?
Coding_idiot
@ codificação_idiot: Você pode passar "Esperar:" na matriz de valores do cabeçalho para desativá-lo. Ex .: curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ('HeaderName: HeaderValue', 'Expect:'));
Éter
12
OP não disse nada sobre PHP pensou
hanshenrik
O nome do cabeçalho é maiúsculo com sublinhado e o HTTP_ é prefixado. Por exemplo, "token de proteção" se torna "HTTP_PROTECTION_TOKEN".
Bimal Poudel
44

GET (vários parâmetros):

curl -X  GET "http://localhost:3000/action?result1=gh&result2=ghk"

ou

curl --request  GET "http://localhost:3000/action?result1=gh&result2=ghk"

ou

curl  "http://localhost:3000/action?result1=gh&result2=ghk"

ou

curl -i -H "Application/json" -H "Content-type: application/json"  "http://localhost:3000/action?result1=gh&result2=ghk"
Vietnhi Phuvan
fonte
1
Obrigado. Não percebi as cotações obrigatórias para esse tipo de URL.
remat_br 24/10
12

Eu uso o Postman.

Execute a chamada que você deseja fazer. Em seguida, o carteiro fornece uma ferramenta útil para mostrar o código de ondulação.

Execute-o no terminal. insira a descrição da imagem aqui

insira a descrição da imagem aqui

Rajendra Prasad Patil
fonte
Este é um bom truque para acelerar as coisas, mas tenha cuidado de escapar das aspas simples ou duplas, se você estiver usando shell script em janelas como shell script tem suas próprias exigências de formatação
Thierrydev
Embora o carteiro seja uma boa ferramenta, mas quando você não tem um ambiente gráfico como nos pods do Kubernetes, é inútil. Aprenda a enrolar e você sempre pode testar o descanso.
Namphibian
11

Você também pode enviar vários cabeçalhos, dados (JSON por exemplo) e especificar o método de chamada (POST, GET) em uma única chamada CUrl como esta:

curl -X POST(Get or whatever) \
  http://your_url.com/api/endpoint \
  -H 'Content-Type: application/json' \
  -H 'header-element1: header-data1' \
  -H 'header-element2: header-data2' \

...... mais cabeçalhos ................

  -d '{
  "JsonExArray": [
    {
      "json_prop": "1",
    },
    {
      "json_prop": "2",
    }
  ]
}'
LeMeme
fonte
9

Eu mudei de curl para Httpie ; a sintaxe se parece com:

http http://myurl HeaderName:value
Graham Perks
fonte
7

Caso deseje enviar seus cabeçalhos personalizados , faça o seguinte:

curl -v -H @{'custom_header'='custom_header_value'} http://localhost:3000/action?result1=gh&result2=ghk
Palsri
fonte
2

No ambiente anaconda através do Windows, os comandos devem ser: GET, por exemplo:

curl.exe http://127.0.0.1:5000/books 

Poste ou corrija os dados para ex:

curl.exe http://127.0.0.1:5000/books/8 -X PATCH -H "Content-Type: application/json" -d '{\"rating\":\"2\"}' 

PS: adicione barra invertida para dados json para evitar esse tipo de erro => Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)

e use em curl.exevez de curlapenas para evitar esse problema:

Invoke-WebRequest : Cannot bind parameter 'Headers'. Cannot convert the "Content-Type: application/json" value of type
"System.String" to type "System.Collections.IDictionary".
At line:1 char:48
+ ... 0.1:5000/books/8 -X PATCH -H "Content-Type: application/json" -d '{\" ...
+                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
DINA TAKLIT
fonte