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?

gagneet
la source
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 "[email protected]" 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/
Randhi Rupesh
la source
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.

Tader
la source
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'));
James
la source
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"
Vietnhi Phuvan
la source
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

Rajendra Prasad Patil
la source
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",
    }
  ]
}'
LeMeme
la source
9

Je suis passé de curl à Httpie ; la syntaxe ressemble à:

http http://myurl HeaderName:value
Graham Perks
la source
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
Palsri
la source
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
DINA TAKLIT
la source