¿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?


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

¿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.


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

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"

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í


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


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.