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.