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?


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 "fileupload=@filename.txt" 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/

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


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'));

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"

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


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",
    }
  ]
}'


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.