Saya menggunakan curl
di baris perintah di Linux untuk mengeluarkan permintaan HTTP. Badan respons dicetak dengan standar keluar, yang baik-baik saja, tetapi saya tidak dapat melihat dari halaman manual cara mendapatkan ikal untuk mencetak kode status HTTP dari respons (404, 403 dll). Apakah ini mungkin?
799
-i
bendera, seperti dalamcurl -i https://www.example.com/
, mungkin apa yang Anda inginkan, sesuai superuser.com/a/514798/190188curl -IL http://www.example.com | grep "^HTTP\/"
?Jawaban:
Ini akan berfungsi untuk Anda jika server web dapat menanggapi permintaan HEAD (ini tidak akan melakukan a
GET
):Sebagai tambahan, untuk membiarkan CURL mengikuti arahan ulang (3xx status) tambahkan -L.
sumber
curl -I
melakukan permintaan HTTP HEAD, yang dapat bermasalah untuk menguji kode status HTTP untuk beberapa server dan layanan aplikasi webhead -n 1|cut -d$' ' -f2
curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
. Tambahkan -L ke ikal jika Anda membutuhkan status akhir setelah pengalihan.curl -I -X GET
akan mengirim permintaan GET, tetapi memberikan hasil yang sama.Cara yang lebih spesifik untuk mencetak hanya kode status HTTP adalah sesuatu di sepanjang baris:
Jauh lebih mudah untuk dikerjakan dalam skrip, karena tidak memerlukan parsing :-)
Parameter
-I
mungkin ditambahkan untuk meningkatkan kinerja beban respons. Parameter ini hanya meminta status / header tanggapan, tanpa badan tanggapan unduhan.Catatan:
%{http_code}
kembali pada baris pertama payload HTTPyaitu:
sumber
/dev/null
bahkan berfungsi di Windows curl versi yang saya gunakan.httping -c 1 -s -G -m
mengeluarkan GET dan tidak mengunduh keseluruhan file, meskipun saya menyadari pertanyaan ini khusus tentang curl.-s
= Jangan tampilkan kemajuan unduhan,-o /dev/null
= jangan tampilkan isi,-w "%{http_code}"
= Tulis kode respons http ke stdout setelah keluar.Jika Anda ingin melihat tajuk serta hasilnya, Anda dapat menggunakan opsi verbose:
Status akan muncul di tajuk. Misalnya
sumber
Anda dapat mencetak kode status, selain semua tajuk dengan melakukan hal berikut:
Hal yang baik tentang
-i
itu bekerja dengan-X POST
baik.sumber
-i
bekerja dengan metode HTTP apa pun , bukan hanyaGET
danPOST
... :)-s
(jangan tampilkan progress meter atau pesan kesalahan) dan-S
(jangan tampilkan pesan kesalahan)Jika Anda ingin mengambil kode status HTTP dalam suatu variabel, tetapi masih mengarahkan konten ke STDOUT, Anda harus membuat dua STDOUT. Anda dapat melakukannya dengan subtitusi proses> () dan memerintahkan subtitusi $ () .
Pertama, buat deskriptor file
3
untuk proses STDOUT Anda saat ini denganexec 3>&1
.Kemudian, gunakan
-o
opsi curl untuk mengarahkan ulang konten respons ke fifo sementara menggunakan substitusi perintah, dan kemudian di dalam substitusi perintah itu, redirect output kembali ke proses Anda saat ini STDOUT3
dengan deskriptor file-o >(cat >&3)
.Menyatukan semuanya dalam
bash
3.2.57(1)-release
(standar untukmacOS
):Perhatikan bahwa ini tidak berfungsi
/bin/sh
seperti yang dicatat oleh SamK dalam komentar di bawah .sumber
STDOUT
, jadi Anda harus dapat mengarahkan keluaran dari perintah ke mana pun Anda suka seperti perintah biasa. Saya belum menguji ini.Definisikan kembali curl output:
Dapat digunakan dengan jenis permintaan apa pun.
sumber
Kode status HANYA
Semua kredit untuk GIST ini
sumber
Ini adalah
curl --fail
batasan yang menyakitkan . Dariman curl
:Tetapi tidak ada cara untuk mendapatkan kode pengembalian non-nol DAN badan respons di stdout.
Berdasarkan jawaban pvandenberk dan trik lain yang sangat berguna yang dipelajari pada SO , berikut ini solusinya:
Fungsi ini berperilaku persis seperti
curl
, tetapi akan mengembalikan 127 (kode pengembalian tidak digunakan olehcurl
) dalam kasus kode HTTP dalam kisaran [400, 600 [.sumber
Ini akan mengirimkan permintaan ke url, dapatkan hanya baris pertama dari respons, pisahkan pada blok dan pilih yang kedua.
Ini berisi kode respons
sumber
Untuk permintaan POST, yang berikut ini berfungsi:
sumber
Gunakan perintah CURL berikut dan pipa untuk grep seperti:
Inilah yang dilakukan oleh setiap bendera:
-I
: Tampilkan hanya header tanggapan-s
: Diam - Jangan tampilkan bilah kemajuan-L
: IkutiLocation:
tajukBerikut ini tautan ke kode status HTTP .
Jalankan dari baris perintah. Ikal ini berjalan dalam mode diam, mengikuti arahan ulang, dapatkan header HTTP. grep akan mencetak kode status HTTP ke output standar.
sumber
Ini akan mengembalikan informasi berikut:
sumber
Berikut adalah beberapa perintah curl yang menggunakan
GET
dan yang mengembalikan kode HTTP.Harap diingat bahwa pendekatan di bawah ini menggunakan
HEAD
, yang lebih cepat tetapi mungkin tidak berfungsi dengan baik dengan beberapa server HTTP yang kurang patuh web.sumber
Contoh cara menggunakan kode respons. Saya menggunakan ini untuk mengunduh ulang basis data Geolite hanya jika mereka telah mengubah (
-z
) & juga mengikuti arahan ulang (-L
):sumber
OP ingin mengetahui kode status. Seringkali saat mengunduh file Anda juga ingin merasakan ukurannya jadi saya menggunakan curl terlebih dahulu untuk menunjukkan kode status dan ukuran file dan kemudian matikan verbose dan arahkan file ke tempat dan nama yang saya inginkan:
Lalu saya menunggu finishing dari curl
sebelum saya menjalankan perintah selanjutnya. Di atas ketika digunakan dalam skrip banyak perintah seperti di atas memberikan respons yang bagus seperti:
Harap dicatat bahwa -o dalam curl harus diikuti oleh path lengkap file + nama file. Ini memungkinkan Anda untuk menyimpan file dalam struktur nama yang masuk akal ketika Anda menggunakan file tersebut dengan ikal. Perhatikan juga bahwa -s dan -S yang digunakan bersama-sama membungkam output tetapi tidak menunjukkan kesalahan. Perhatikan juga bahwa -R mencoba mengatur stempel waktu file ke file web.
Jawaban saya didasarkan pada apa yang semula disarankan @pvandenberk, tetapi selain itu sebenarnya menyimpan file di suatu tempat, alih-alih hanya mengarahkan ke / dev / null.
sumber
Pisahkan konten output menjadi
stdout
dan kode status HTTP kestderr
:Jika hanya kode status HTTP yang diinginkan untuk stderr,
--silent
dapat digunakan:Aliran yang diinginkan kemudian dapat dipilih dengan mengarahkan yang tidak diinginkan ke
/dev/null
:Perhatikan bahwa untuk pengalihan kedua agar berperilaku seperti yang diinginkan, kita perlu menjalankan perintah curl dalam subkulit.
sumber
bash
proses substitusi./tmp/out
/tmp/err
file dapat menyebabkan hasil yang tidak terduga jika dijalankan secara paralel.