Hanya mendapatkan header respons dari HTTP POST menggunakan curl

561

Satu dapat meminta hanya header menggunakan HTTP HEAD, sebagai opsi -Idi curl(1).

$ curl -I /

Badan tanggapan HTML yang panjang sulit diterima di baris perintah, jadi saya hanya ingin mendapatkan tajuk sebagai umpan balik untuk permintaan POST saya. Namun, KEPALA dan POST adalah dua metode yang berbeda.

Bagaimana saya mendapatkan ikal untuk hanya menampilkan header respons terhadap permintaan POST?

Jonathan Allard
sumber

Jawaban:

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.

dan

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

dan

-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.

dari halaman manual. begitu

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

mengikuti arahan ulang, membuang header ke stdout dan mengirim data ke / dev / null (itu GET, bukan POST, tetapi Anda dapat melakukan hal yang sama dengan POST - cukup tambahkan opsi apa pun yang sudah Anda gunakan untuk data POSTing)

perhatikan tanda -setelah -Dyang menunjukkan bahwa "file" output adalah stdout.

andrew cooke
sumber
22
komentar di atas valid jika Anda menggunakan PowerShell. untuk penggunaan cmd.execurl -s -D - http://yahoo.com -o nul
JJS
1
@JJS untuk saya $ null bekerja pada Win7. Apakah karena cLink diinstal pada windows.
Satya Prakash
17
"-" di depan URL mungkin tampak tidak penting, tetapi sebenarnya tidak.
Wahid Sadik
1
@ Wahidadadik Kenapa begitu khususnya? Apa fungsi dasbor tunggal?
mamachanko
4
@ Mamachanko -Dmengambil argumen yang mengatakan ke mana output harus pergi. tanda tunggal berarti harus menuju stdout.
andrew cooke
172

Jawaban lain memerlukan badan tanggapan untuk diunduh. Tetapi ada cara untuk membuat permintaan POST yang hanya akan mengambil tajuk:

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

Sebuah -Idengan sendirinya melakukan permintaan HEAD yang dapat diganti dengan -X POSTmelakukan POST (atau lainnya) permintaan dan masih hanya mendapatkan data sundulan.

siracusa
sumber
15
Jawaban ini sebenarnya benar karena server web dapat mengembalikan tajuk yang berbeda berdasarkan metode permintaan. Jika Anda ingin memeriksa tajuk pada GET, Anda harus menggunakan permintaan GET.
chhantyal
6
Ini adalah jawaban yang paling benar, menurut saya. Mudah diingat, ia benar-benar mengirimkan GETpermintaan dan tidak mengunduh seluruh badan tanggapan (atau setidaknya tidak mengeluarkannya). The -sbendera dan tidak perlu.
skozin
@JeffPuckettII juga agak nitpicking saya akan mengatakan. Anda dapat mengganti GETdengan POSTperintah di atas dan itu akan berfungsi seperti yang diharapkan. or any otheradalah kunci di sana.
chhantyal
18
Ini tidak berfungsi ketika Anda benar-benar ingin POSTbeberapa data. Curl mengatakan:Warning: You can only select one HTTP request method! You asked for both POST Warning: (-d, --data) and HEAD (-I, --head).
SebastianH
2
@nickboldt Intinya di sini adalah bahwa server mungkin merespons berbeda terhadap permintaan HEAD daripada permintaan POST atau GET (dan beberapa server benar-benar melakukan itu), jadi -X HEADtidak ada solusi yang dapat diandalkan di sini.
siracusa
58

Perintah berikut menampilkan informasi tambahan

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

Anda dapat meminta server untuk mengirim HEAD saja, alih-alih respons penuh

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

Note:Dalam beberapa kasus, server dapat mengirim tajuk yang berbeda untuk dikirim dan KEPALA. Namun dalam hampir semua kasus, header sama.

zainengineer
sumber
5
Sangat disayangkan bahwa jawaban yang lain menang, karena ini adalah jawaban yang benar - tidak perlu mentransfer banyak data.
Daniel
1
@dmd Jika saya memahami manual CURL -X, --requestdengan benar, -X HEADmasih menghasilkan "satu ton data" tetapi ada -I, --headyang akan menghasilkan apa yang Anda harapkan.
Daniel AR Werner
1
Anda tidak memahaminya dengan benar. -X HEADdan -Ipersis sama.
Daniel
18
Masalahnya -X HEADadalah bahwa server mungkin merespons secara berbeda, karena sekarang menerima HEADpermintaan alih-alih GET(atau apa pun permintaan sebelumnya)
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

Untuk badan respons panjang (dan berbagai situasi serupa lainnya), solusi yang saya gunakan adalah selalu menyalurkan ke less, jadi

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

atau

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

akan melakukan pekerjaan itu.

fiatjaf
sumber
ini tidak setara. yang pertama mengeluarkan HEADpermintaan di mana banyak server merespons secara berbeda. yang kedua mengeluarkan GETpermintaan yang lebih seperti apa yang kita cari di sini.
glasz
25

Mungkin ini sedikit ekstrim, tapi saya menggunakan versi super singkat ini:

curl -svo. <URL>

Penjelasan:

-v cetak informasi debug (termasuk header)

-o.mengirim data halaman web (yang ingin kita abaikan) ke file tertentu, .dalam hal ini, yang merupakan direktori dan merupakan tujuan yang tidak valid dan membuat output diabaikan.

-stidak ada bilah kemajuan, tidak ada informasi kesalahan (jika tidak Anda akan melihat Warning: Failed to create the file .: Is a directory)

peringatan: hasil selalu gagal (dalam hal kode kesalahan, jika dapat dijangkau atau tidak). Jangan gunakan dalam, katakanlah, pernyataan kondisional dalam skrip shell ...

exebook
sumber
1
Kenapa menggunakan -o.bukan -o /dev/null?
bfontaine
@bfontaine -o.digunakan versus -o /dev/nulluntuk singkatnya
exebook
itu tidak memiliki perilaku yang sama, jadi aneh untuk menggunakannya hanya untuk menghemat 8 karakter.
bfontaine
2
@ bfontaine ada jawaban lain yang menunjukkan bagaimana melakukan ini dengan cara yang paling benar, yang ini ada di sini untuk menunjukkan alternatif singkat yang melakukan hal yang sama pada dasarnya.
exebook
Anda harus mengklarifikasi dalam jawaban Anda bahwa perintah ini selalu gagal. curl -svo. <url> && echo footidak akan mencetak fookarena -o.make curlmengembalikan (= error) kode-nol non: curl: (23) Failed writing body.
bfontaine
16

Jauh lebih mudah - inilah yang saya gunakan untuk menghindari pelacakan Shortlink - adalah sebagai berikut:

curl -IL http://bit.ly/in-the-shadows

... yang juga mengikuti tautan .

kaisar
sumber
14

Sementara jawaban lain tidak bekerja untuk saya dalam semua situasi, solusi terbaik yang dapat saya temukan (bekerja dengan POSTbaik), diambil dari sini :

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

Daniel AR Werner
sumber
1
Saya harus meletakkan url di antara tanda kutip agar ini berfungsi.
Christophe Weis
1
Apakah ini perlu atau tidak tergantung pada url dan shell yang digunakan. Saya memperbaiki jawabannya. Terima kasih.
Daniel AR Werner
3

headcurl.cmd (versi windows)

curl -sSkv -o NUL %* 2>&1
  • Saya tidak ingin bilah kemajuan -s,
  • tapi saya ingin kesalahan -S,
  • tidak peduli tentang sertifikat https yang valid -k,
  • mendapatkan verbositas tinggi -v(ini tentang pemecahan masalah, bukan?),
  • tidak ada output (dengan cara bersih).
  • oh, dan saya ingin meneruskan stderr ke stdout , jadi saya bisa menentang semuanya (karena sebagian besar atau semua output datang dalam stderr)
  • %*berarti [serahkan semua parameter ke skrip ini] (well ( https://stackoverflow.com/a/980372/444255 ), well biasanya itu hanya satu parameter: url yang Anda uji

contoh dunia nyata (tentang pemecahan masalah 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

Versi Linux

untuk .bash_aliases/ Anda .bash_rc:

alias headcurl='curl -sSkv -o /dev/null $@  2>&1'
Frank Nocke
sumber
Ini akan mengunduh tubuh dan menghabiskan bandwidth, waktu. Jawaban @siracusa ( stackoverflow.com/a/38679650/6168139 ) tidak memiliki overhead ini.
rushi
Jika & ketika Anda menginginkan POST, tambahkan -X POSTke parameter passthrough, jika Anda ingin GET, gunakan GET (yaitu default), karena respons mungkin berbeda. - Kecuali Anda melakukan curling berat pada skrip produksi (bukan untuk diagnosis dan pengembangan) Saya tidak peduli sedikit bandwidth.
Frank Nocke
Saya berencana untuk melihat apakah file di server diperbarui atau tidak menggunakan 'Terakhir Dimodifikasi'. File-file itu sendiri besar, ada yang di GB, dan saya biasanya di internet seluler. Jadi, bandwidth besar ini adalah masalah bagi saya.
rushi
Itu akan menjadi retas . Saya tidak perlu melakukan ini karena jawaban siracusa melakukan tugas dengan akurat.
rushi