Come inviare un'intestazione utilizzando una richiesta HTTP tramite una chiamata a ricciolo?


1448

Desidero inviare un'intestazione al mio server Apache su una scatola Linux. Come posso ottenere questo tramite una chiamata a ricciolo?


60
C'è un buon modo per imparare ad usare l'arricciatura per le richieste http da esempi. Scarica la versione più recente di Postman, esegui qualsiasi configurazione di richiesta http come desideri a livello di interfaccia utente (pubblica, inserisci, ottieni .. ad esempio, con intestazioni e json body) e fai clic su "genera codice" e scegli l'opzione "arriccia" . Ti dà la riga di comando equivalente.
Vinicius Lima,

Risposte:


513

OTTENERE:

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

INVIARE:

Per pubblicare dati:

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

Per il caricamento di file:

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

Post HTTP RESTful:

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

Per accedere a un sito (auth):

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

cosa si intende per @filename per il post RESTful? stai postando un file su un server REST? mi sembra strano
JesseBoyd,

6
Per le persone che arrivano dopo che potrebbero chiedersi la stessa cosa ... @ notation è un modo per leggere i dati da inviare al server da un file, piuttosto che incorporarli nella richiesta di arricciatura. Non pubblichi un file di per sé, stai postando il contenuto del file come corpo della tua richiesta POST.
f1dave,

Più risposta dettagliata qui: 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.

Esempio:

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

Puoi vedere la richiesta di arricciatura inviata aggiungendo l' -vopzione.


74
Se si desidera inviare più intestazioni, utilizzare più di un'intestazione - va bene, il ricciolo analizzerà ciascuna come un'intestazione diversa. Non è possibile separare le intestazioni all'interno dello stesso parametro --header. esempio: curl --header "Accetta: javascript" --header "test: ciao" -v www.google.com
Hatoru Hansou

2
Se la gente vuole degli esempi, lo lascerò qui: bropages.org
Peter Westmacott,

le pagine man (almeno su OSX) ora includono un esempio: Esempio: # curl -H "X-First-Name: Joe" 192.168.0.1
JESii

6
@MartinKonicek e altri: consiglio vivamente tldr utiltiy (birra, ecc. Install tldr). I suoi unici esempi. ad es. "- Invia una richiesta con un'intestazione aggiuntiva, utilizzando un metodo HTTP personalizzato: curl -H 'X-My-Header: 123' -X PUT example.com "

280

In PHP :

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

oppure puoi impostare più:

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

1
@James funziona bene in alcuni casi, ma in altri CURL invia un'intestazione aggiuntiva "Aspetto: 100-continua" - hai idea di come rimuoverlo?
coding_idiot,

@coding_idiot: è possibile passare "Expect:" nella matrice dei valori di intestazione per disabilitarlo. Es .: curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ('HeaderName: HeaderValue', 'Expect:'));
etere,

12
OP non ha detto nulla sul pensiero di PHP
hanshenrik il

Il nome dell'intestazione è in maiuscolo con caratteri di sottolineatura e HTTP_ ha il prefisso. Ad esempio, "token di protezione" diventa "HTTP_PROTECTION_TOKEN".
Bimal Poudel,


44

OTTIENI (parametri multipli):

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
Grazie. Non ho realizzato le citazioni obbligatorie per questo tipo di URL.
remat_br,

12

Uso Postman.

Esegui qualsiasi chiamata tu voglia fare. Quindi, postino fornisce uno strumento utile per mostrare il codice di arricciatura.

Eseguilo nel terminale. inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


Questo è un buon trucco per velocizzare le cose, ma fai attenzione a sfuggire alle virgolette singole o alle doppie virgolette se stai usando lo script di shell su Windows poiché lo script di shell ha i suoi requisiti di formattazione
Thierrydev

Mentre il postino è uno strumento piacevole ma quando non hai un ambiente grafico come nei baccelli di Kubernetes è inutile. Impara l'arricciatura e puoi sempre testare il riposo.
Namphibian,

11

Puoi anche inviare più intestazioni, dati (ad esempio JSON) e specificare il metodo Call (POST, GET) in una singola chiamata CUrl in questo modo:

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

...... più intestazioni ................

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


7

Nel caso in cui desideri inviare le intestazioni personalizzate , puoi farlo in questo modo:

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

2

In ambiente anaconda tramite windows i comandi dovrebbero essere: GET, per es:

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

Pubblica o patch i dati per es:

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

PS: aggiungi una barra rovesciata per i dati json per evitare questo tipo di errore => Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)

e usa curl.exeinvece di curlsolo per evitare questo 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.