Comment envoyer un en-tête à l'aide d'une requête HTTP via un appel curl?


1448

Je souhaite envoyer un en-tête à mon serveur Apache sur une box Linux. Comment puis-je y parvenir via un appel curl?


60
Il existe un bon moyen d'apprendre à utiliser curl pour les requêtes http par des exemples. Téléchargez la dernière version de Postman, faites n'importe quelle configuration de requête http comme vous le souhaitez au niveau de l'interface utilisateur (post, put, get .. par exemple, avec les en-têtes et le corps json), puis cliquez sur "générer du code" et choisissez l'option "curl" . Il vous donne la ligne de commande équivalente.
Vinicius Lima

Réponses:


513

AVOIR:

avec JSON:

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

avec XML:

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

PUBLIER:

Pour publier des données:

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

Pour le téléchargement de fichiers:

curl --form "fileupload=@filename.txt" http://hostname/resource

Publication HTTP RESTful:

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

Pour vous connecter à un site (auth):

curl -d "username=admin&password=admin&submit=Login" --dump-header headers http://localhost/Login
curl -L -b headers http://localhost/

que signifie @filename pour le message RESTful? POSTEZ-VOUS un fichier sur un serveur REST? cela me semble étrange
JesseBoyd

6
Pour les personnes arrivant plus tard qui pourraient se demander la même chose ... La notation @ est un moyen de lire les données à envoyer au serveur à partir d'un fichier, plutôt que de les intégrer dans la demande curl. Vous ne POSTEZ PAS un fichier en soi, vous POSTEZ le contenu du fichier comme le corps de votre demande POST.
f1dave

Réponse plus détaillée ici: 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.

Exemple:

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

Vous pouvez voir la demande que curl a envoyée en ajoutant l' -voption.


74
Si vous souhaitez envoyer plusieurs en-têtes, utilisez plusieurs en-têtes, c'est correct, curl analysera chacun en tant qu'en-tête différent. Il n'y a aucun moyen de séparer les en-têtes à l'intérieur du même paramètre --header. exemple: curl --header "Accepter: javascript" --header "test: bonjour" -v www.google.com
Hatoru Hansou

2
Si les gens veulent des exemples, je laisserai juste ceci ici: bropages.org
Peter Westmacott

les pages de manuel (sur OSX, au moins) incluent désormais un exemple: Exemple: # curl -H "X-First-Name: Joe" 192.168.0.1
JESii

6
@MartinKonicek et autres: je recommande fortement l'utilitaire tldr (infusion, etc. installez tldr). Ses seuls exemples. par exemple "- Envoyer une demande avec un en-tête supplémentaire, en utilisant une méthode HTTP personnalisée: curl -H 'X-My-Header: 123' -X PUT example.com "

280

En PHP :

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

ou vous pouvez en définir plusieurs:

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

1
@James, cela fonctionne bien dans certains cas, mais dans d'autres, CURL envoie un en-tête supplémentaire "Expect: 100-continue" - une idée sur la façon de le supprimer?
coding_idiot

@coding_idiot: Vous pouvez passer "Expect:" dans le tableau de valeurs d'en-tête pour le désactiver. Ex .: curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ('HeaderName: HeaderValue', 'Expect:'));
ether

12
OP n'a rien dit sur la pensée de PHP
hanshenrik

Le nom de l'en-tête est en majuscule avec des traits de soulignement et HTTP_ est préfixé. Par exemple, "jeton de protection" devient "HTTP_PROTECTION_TOKEN".
Bimal Poudel


44

GET (plusieurs paramètres):

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
Merci. Je n'ai pas réalisé les devis obligatoires pour ce type d'URL.
remat_br

12

J'utilise Postman.

Exécutez tout appel que vous souhaitez faire. Postman fournit ensuite un outil pratique pour afficher le code curl.

Exécutez-le dans le terminal. entrez la description de l'image ici

entrez la description de l'image ici


C'est un bon hack pour accélérer les choses mais attention à échapper aux guillemets simples ou doubles si vous utilisez un script shell sur Windows car le script shell a ses propres exigences de formatage
Thierrydev

Bien que le facteur soit un bon outil, mais lorsque vous n'avez pas d'environnement graphique comme dans les pods Kubernetes, il est inutile. Apprenez le curl et vous pouvez toujours tester le repos.
Namphibian

11

Vous pouvez également envoyer plusieurs en-têtes, des données (JSON par exemple) et spécifier la méthode d'appel (POST, GET) dans un seul appel CUrl comme ceci:

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' \

...... plus d'en-têtes ................

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


7

Si vous souhaitez envoyer vos en- têtes personnalisés , vous pouvez le faire de cette façon:

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

2

Dans l' environnement anaconda via windows, les commandes doivent être: GET, par exemple:

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

Publiez ou corrigez les données par exemple:

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

PS: Ajoutez une barre oblique inverse pour les données json pour éviter ce type d'erreur => Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)

et utilisez curl.exeau lieu de curlseulement pour éviter ce problème:

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.