Ottenere solo intestazione di risposta da HTTP POST usando curl


561

È possibile richiedere solo le intestazioni utilizzando HTTP HEAD, come opzione -Iin curl(1).

$ curl -I /

I corpi di risposta HTML lunghi sono una seccatura da inserire nella riga di comando, quindi mi piacerebbe ottenere solo l'intestazione come feedback per le mie richieste POST. Tuttavia, HEAD e POST sono due metodi diversi.

Come posso ottenere l'arricciatura per visualizzare solo le intestazioni di risposta a una richiesta POST?

Risposte:


773
-D, --dump-header <file>
       Write the protocol headers to the specified file.

       This  option  is handy to use when you want to store the headers
       that a HTTP site sends to you. Cookies from  the  headers  could
       then  be  read  in  a  second  curl  invocation by using the -b,
       --cookie option! The -c, --cookie-jar option is however a better
       way to store cookies.

e

-S, --show-error
       When used with -s, --silent, it makes curl show an error message if it fails.

e

-L/--location
      (HTTP/HTTPS) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response
      code), this option will make curl redo the request on the new place. If used together with -i/--include or -I/--head, headers from  all  requested
      pages  will  be  shown.  When authentication is used, curl only sends its credentials to the initial host. If a redirect takes curl to a different
      host, it won’t be able to intercept the user+password. See also --location-trusted on how to change this. You can limit the amount of redirects to
      follow by using the --max-redirs option.

      When curl follows a redirect and the request is not a plain GET (for example POST or PUT), it will do the following request with a GET if the HTTP
      response was 301, 302, or 303. If the response code was any other 3xx code, curl will re-send the following  request  using  the  same  unmodified
      method.

dalla pagina man. così

curl -sSL -D - www.acooke.org -o /dev/null

segue i reindirizzamenti, scarica le intestazioni su stdout e invia i dati a / dev / null (che è un GET, non un POST, ma puoi fare la stessa cosa con un POST - aggiungi qualsiasi opzione che stai già utilizzando per i dati POST)

notare il -dopo -Dche indica che il "file" di output è stdout.


22
il commento sopra è valido se stai usando PowerShell. per l'uso di cmd.execurl -s -D - http://yahoo.com -o nul
JJS

1
@JJS per me $ null ha funzionato su Win7. È dovuto a cLink installato su Windows.
Satya Prakash,

17
Il "-" davanti all'URL può sembrare poco importante, ma non lo è.
Wahid Sadik,

1
@WahidSadik Perché è questo il caso in particolare? Qual è la funzione del singolo trattino?
mamachanko,

4
@mamachanko -Dprende un argomento che dice dove dovrebbe andare l'output. il trattino singolo significa che dovrebbe andare allo stdout.
Andrew Cooke,

172

Le altre risposte richiedono il download del corpo della risposta. Ma c'è un modo per fare una richiesta POST che recupererà solo l'intestazione:

curl -s -I -X POST http://www.google.com

Di -Iper sé esegue una richiesta HEAD che può essere ignorata -X POSTper eseguire una richiesta POST (o qualsiasi altra) e ottenere comunque solo i dati di intestazione.


15
Questa risposta è in realtà corretta perché i server Web possono restituire intestazioni diverse in base al metodo di richiesta. Se vuoi controllare le intestazioni su GET, devi usare la richiesta GET.
chhantyal,

6
Questa è la risposta più corretta, secondo me. È facile da ricordare, in realtà invia una GETrichiesta e non scarica l'intero corpo della risposta (o almeno non lo emette ). La -sbandiera non è né necessaria.
skozin,

@JeffPuckettII beh un po 'nitpicking direi. È possibile sostituire GETcon il POSTcomando precedente e funzionerà come previsto. or any otherè la chiave lì.
chhantyal,

18
Questo non funziona quando si desidera effettivamente POSTalcuni dati. Curl dice:Warning: You can only select one HTTP request method! You asked for both POST Warning: (-d, --data) and HEAD (-I, --head).
SebastianH,

2
@nickboldt Il punto qui è che un server potrebbe rispondere in modo diverso a una richiesta HEAD rispetto a una richiesta POST o GET (e alcuni server effettivamente lo fanno), quindi -X HEADqui non esiste una soluzione affidabile.
siracusa

58

Il comando seguente visualizza ulteriori informazioni

curl -X POST http://httpbin.org/post -v > /dev/null

Puoi chiedere al server di inviare solo HEAD, invece della risposta completa

curl -X HEAD -I http://httpbin.org/

Note:In alcuni casi, il server può inviare intestazioni diverse per posta e HEAD. Ma in quasi tutti i casi le intestazioni sono uguali.


5
È un peccato che l'altra risposta abbia vinto, perché questa è la risposta corretta: non trasferisce inutilmente una tonnellata di dati.
Daniel,

1
@dmd Se capisco -X, --requestcorrettamente il manuale di cURL , -X HEADsi ottiene comunque "una tonnellata di dati", ma c'è ciò -I, --headche dovrebbe comportare ciò che si sta anticipando.
Daniel AR Werner,

1
Non lo capisci correttamente. -X HEADe -Isono esattamente equivalenti.
Daniel,

18
Il problema -X HEADè che il server potrebbe rispondere in modo diverso, poiché ora riceve una HEADrichiesta anziché un GET(o qualunque fosse la richiesta precedente)
Grav

4
Warning: Setting custom HTTP method to HEAD with -X/--request may not work the Warning: way you want. Consider using -I/--head instead.
Dorian,

53

Per i corpi a risposta lunga (e varie altre situazioni simili), la soluzione che uso è sempre quella di convogliare less, quindi

curl -i https://api.github.com/users | less

o

curl -s -D - https://api.github.com/users | less

farà il lavoro.


questi non sono equivalenti. il primo invia una HEADrichiesta a cui molti server rispondono in modo diverso. la seconda emette una GETrichiesta che assomiglia di più a ciò che stiamo cercando qui.
glasz,

25

Forse è un po 'estremo, ma sto usando questa versione super corta:

curl -svo. <URL>

Spiegazione:

-v stampa informazioni di debug (che include le intestazioni)

-o.invia i dati della pagina Web (che vogliamo ignorare) a un determinato file, .in questo caso, che è una directory ed è una destinazione non valida e fa sì che l'output venga ignorato.

-snessuna barra di avanzamento, nessuna informazione di errore (altrimenti vedresti Warning: Failed to create the file .: Is a directory)

attenzione: il risultato fallisce sempre (in termini di codice di errore, se raggiungibile o meno). Non usare, diciamo, le istruzioni condizionali negli script di shell ...


1
Perché usare -o.invece di -o /dev/null?
bfontaine,

@bfontaine -o.è usato contro -o /dev/nullper brevità
exebook

non ha lo stesso comportamento, quindi è strano usarlo solo per salvare 8 caratteri.
bfontaine,

2
@bfontaine ci sono altre risposte che mostrano come farlo nel modo più corretto, questo è qui per mostrare la breve alternativa che fa sostanzialmente la stessa cosa.
exebook

Dovresti chiarire nella tua risposta che questo comando fallisce sempre . curl -svo. <url> && echo foonon stampa fooperché -o.make curlrestituire un codice diverso da zero (= errore): curl: (23) Failed writing body.
bfontaine,


14

Mentre le altre risposte non hanno funzionato per me in tutte le situazioni, la migliore soluzione che ho potuto trovare (lavorando anche con POST), presa da qui :

curl -vs 'https://some-site.com' 1> /dev/null


1
Ho dovuto inserire l'url tra virgolette per farlo funzionare.
Christophe Weis,

1
Se ciò sia necessario o meno potrebbe dipendere dall'URL e dalla shell utilizzata. Ho migliorato la risposta di conseguenza. Grazie.
Daniel AR Werner,

3

headcurl.cmd (versione Windows)

curl -sSkv -o NUL %* 2>&1
  • Non voglio una barra di avanzamento -s,
  • ma voglio errori -S,
  • non preoccuparsi dei certificati https validi -k,
  • ottenere alta verbosità -v(si tratta di risoluzione dei problemi, vero?),
  • nessuna uscita (in modo pulito).
  • oh, e voglio inoltrare stderr a stdout , quindi posso fare grep contro tutto (dal momento che la maggior parte o tutto l'output arriva in stderr)
  • %*significa [passare tutti i parametri a questo script] (bene ( https://stackoverflow.com/a/980372/444255 ), bene di solito questo è solo un parametro: l'URL che stai testando

esempio reale (sulla risoluzione dei problemi relativi al proxy):

C:\depot>headcurl google.ch | grep -i -e http -e cache
Hostname was NOT found in DNS cache
GET HTTP://google.ch/ HTTP/1.1
HTTP/1.1 301 Moved Permanently
Location: http://www.google.ch/
Cache-Control: public, max-age=2592000
X-Cache: HIT from company.somewhere.ch
X-Cache-Lookup: HIT from company.somewhere.ch:1234

Versione Linux

per il tuo .bash_aliases/ .bash_rc:

alias headcurl='curl -sSkv -o /dev/null $@  2>&1'

Questo scaricherà il corpo e consumerà larghezza di banda, tempo. @siracusa 's risposta ( stackoverflow.com/a/38679650/6168139 ) non ha questo in testa.
Rushi,

Se e quando vuoi POST, aggiungi -X POSTai parametri passthrough, se vuoi GET, usa GET (cioè predefinito), poiché le risposte possono differire. - A meno che tu non faccia un pesante curling negli script di produzione (non per diagnosi e sviluppo) non mi interessa un po 'di larghezza di banda.
Frank Nocke,

Sto programmando di vedere se i file sul server sono aggiornati o non utilizzano "Ultima modifica". I file in sé sono di grandi dimensioni, alcuni sono in GB e di solito sono su Internet cellulare. Quindi, questa grande larghezza di banda è un problema per me.
Rushi,

Sarebbe confuso . Non ho bisogno di farlo poiché la risposta di Siracusa esegue il compito con precisione.
Rushi,
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.