¿Cómo enviar un encabezado usando una solicitud HTTP a través de una llamada curl?

1448

Deseo enviar un encabezado a mi servidor Apache en una caja de Linux. ¿Cómo puedo lograr esto a través de una llamada curl?

gagneet
fuente
6060
Hay una buena manera de aprender a usar curl para solicitudes http con ejemplos. Descargue la versión más reciente de Postman, realice cualquier configuración de solicitud http como desee en el nivel de interfaz de usuario (publicar, poner, obtener ... por ejemplo, con encabezados y cuerpo json) y luego haga clic en "generar código" y elija la opción "curl" . Te da la línea de comando equivalente.
Vinicius Lima

Respuestas:

513

OBTENER:

con JSON:

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

con XML:

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

ENVIAR:

Para publicar datos:

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

Para cargar archivos:

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

Publicación HTTP RESTful:

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

Para iniciar sesión en un sitio (autenticación):

curl -d "username=admin&password=admin&submit=Login" --dump-header headers http://localhost/Login
curl -L -b headers http://localhost/
Randhi Rupesh
fuente
¿Qué significa @filename para la publicación RESTful? ¿Está PUBLICANDO un archivo en un servidor REST? eso me parece extraño
JesseBoyd
66
Para las personas que llegan más tarde y se preguntan lo mismo ... la notación @ es una forma de leer los datos para enviarlos al servidor desde un archivo, en lugar de incluirlos en la solicitud curl. No PUBLICA un archivo per se, está PUBLICANDO el contenido del archivo como el cuerpo de su solicitud POST.
f1dave
Respuesta más detallada aquí: 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.

Ejemplo:

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

Puede ver la solicitud que se envía al agregar la -vopción.

Tader
fuente
74
Si desea enviar varios encabezados, use más de un encabezado, está bien, curl analizará cada uno como un encabezado diferente. No hay forma de separar los encabezados dentro del mismo parámetro --header. ejemplo: curl --header "Aceptar: javascript" --header "prueba: hola" -v www.google.com
Hatoru Hansou
2
Si la gente quiere ejemplos, dejaré esto aquí: bropages.org
Peter Westmacott
Las páginas man (en OSX, al menos) ahora sí incluyen un ejemplo: Ejemplo: # curl -H "X-First-Name: Joe" 192.168.0.1
JESii
66
@ MartinKonicek y otros: Recomiendo encarecidamente la utilidad tldr (brew, etc install tldr). Sus únicos ejemplos. por ejemplo, "- Enviar una solicitud con un encabezado adicional, utilizando un método HTTP personalizado: curl -H 'X-My-Header: 123' -X PUT example.com "
280

En PHP :

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

o puedes configurar múltiples:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName:HeaderValue', 'HeaderName2:HeaderValue2'));
James
fuente
1
@James funciona bien en algunos casos, pero en otros CURL envía un encabezado adicional "Esperar: 100-continuar". ¿Alguna idea sobre cómo eliminarlo?
coding_idiot
@coding_idiot: puede pasar "Esperar:" en la matriz de valores de encabezado para deshabilitarlo. Ej .: curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ('HeaderName: HeaderValue', 'Expect:'));
éter
12
OP no dijo nada sobre el pensamiento PHP
hanshenrik
El nombre del encabezado está en mayúscula con guiones bajos, y HTTP_ tiene el prefijo. Por ejemplo, "token de protección" se convierte en "HTTP_PROTECTION_TOKEN".
Bimal Poudel
44

GET (múltiples parámetros):

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

o

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

o

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

o

curl -i -H "Application/json" -H "Content-type: application/json"  "http://localhost:3000/action?result1=gh&result2=ghk"
Vietnhi Phuvan
fuente
1
Gracias. No me di cuenta de las citas obligatorias para este tipo de URL.
remat_br
12

Yo uso cartero.

Ejecute cualquier llamada que quiera hacer. Luego, cartero proporciona una herramienta útil para mostrar el código de rizo.

Ejecútalo en la terminal. ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Rajendra Prasad Patil
fuente
Este es un buen truco para acelerar las cosas, pero tenga cuidado de escapar de las comillas simples o las comillas dobles si está utilizando el script de shell en Windows, ya que el script de shell tiene sus propios requisitos de formato
Thierrydev
Mientras que cartero es una buena herramienta, pero cuando no tienes un entorno gráfico como en los pods de Kubernetes, es inútil. Aprende el rizo y siempre puedes probar el descanso.
Namphibian
11

También puede enviar múltiples encabezados, datos (JSON, por ejemplo) y especificar el método de llamada (POST, GET) en una sola llamada 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' \

...... más encabezados ................

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

He cambiado de curl a Httpie ; la sintaxis se ve así:

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

En caso de que desee enviar sus encabezados personalizados , puede hacerlo de esta manera:

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

En el entorno de anaconda a través de Windows, los comandos deben ser: GET, por ejemplo:

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

Publicar o parchear los datos para ex:

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

PD: agregue una barra diagonal inversa para datos json para evitar este tipo de error => Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)

y use en curl.exelugar de curlsolo para evitar este 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
fuente