Pertanyaan Mendapatkan curl untuk menghasilkan kode status HTTP?


saya menggunakan curl pada baris perintah di Linux untuk mengeluarkan permintaan HTTP. Tubuh respons dicetak ke standar keluar, yang baik-baik saja, tapi aku tidak bisa melihat dari halaman manual bagaimana mendapatkan curl untuk mencetak kode status HTTP dari respon (404, 403 dll). Apakah ini mungkin?


563
2018-04-18 10:28


asal


Bagi saya, saya dapat melihat dari manual bagaimana mendapatkan kode status HTTP, tetapi opsi -w tidak berfungsi. Saya telah melaporkan bug ke Apple. - Nicolas Barbulesco
Itu -i bendera, seperti pada curl -i https://www.example.com/, mungkin apa yang Anda inginkan, sesuai superuser.com/a/514798/190188 - caw


Jawaban:


Ini seharusnya bekerja untuk Anda jika server web dapat menanggapi permintaan HEAD (ini tidak akan melakukan GET):

curl -I http://www.example.org

Sebagai tambahan, untuk membiarkan cURL mengikuti redirect (3xx status) tambahkan -L.


351
2018-04-18 10:56



NB: curl -I melakukan permintaan HTTP HEAD, yang dapat menjadi masalah untuk menguji kode status HTTP untuk beberapa server dan layanan aplikasi web - Jay Taylor
Dan untuk mendapatkan nomor statusnya saja, pipakan ke head -n 1|cut -d$' ' -f2 - Benubird
Jangan lupa untuk mengalihkan stlera curl: curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2. Tambahkan -L untuk menggulung jika Anda memerlukan status akhir setelah pengalihan. - Aaron Blenkush
Mengikuti pengalihan setelah hanya melakukan permintaan HEAD dapat menyebabkan perilaku yang menarik, tergantung pada bagaimana aplikasi diprogram. - Scott McIntyre
curl -I -X GET akan mengirim permintaan GET, tetapi memberikan hasil yang sama. - jiggy


Cara yang lebih spesifik untuk mencetak hanya kode status HTTP adalah sesuatu di sepanjang baris:

curl -s -o /dev/null -w "%{http_code}" http://www.example.org/

Jauh lebih mudah untuk bekerja dengan skrip, karena tidak memerlukan penguraian apa pun :-)

Parameter-I dapat ditambahkan untuk meningkatkan kinerja beban respons. Parameter ini hanya meminta status / header respons, tanpa respons unduhan. (% {http_code} mengembalikan pada baris pertama dari payload HTTP)

yaitu.:

curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/

631
2018-06-28 00:25



-w "% {http_code}" adalah bit yang mencetak kode status. Anda dapat menambahkan baris baru atau dua di sana untuk memisahkan kode dari badan (-w "\ n \ n% {http_code} \ n") - Jeffrey Martinez
Wow, ini /dev/null Hal bahkan bekerja di versi Windows curl yang saya gunakan. - Uwe Keim
Saya yakin ini mengunduh seluruh file meskipun semuanya berjalan ke / dev / null, jadi tidak ideal untuk memeriksa kode status untuk file besar. httping -c 1 -s -G -m masalah GET dan tidak mengunduh seluruh file, meskipun saya menyadari pertanyaan ini khusus tentang curl. - RomanSt
@romkyns, Anda benar: varian pertama dalam jawaban saya mengunduh seluruh file dan "menyimpan" ke /dev/null, tetapi varian kedua - yaitu. yang menggunakan -I opsi untuk curl - tidak. Namun, perawatan harus dilakukan, karena Anda tidak benar-benar menguji tindakan yang sama: seseorang melakukan HTTP GET permintaan, sementara yang lain membuat HEAD request ... beberapa webservers / websites akan merespon dengan kode status yang berbeda, meskipun URL yang diminta sama persis! - pvandenberk
FYI: -s = Jangan tampilkan kemajuan unduhan, -o /dev/null = jangan tampilkan tubuh, -w "%{http_code}" = Tulis kode tanggapan http ke stdout setelah keluar. - Ajedi32


Jika Anda ingin melihat header serta hasilnya, Anda dapat menggunakan opsi verbose:

curl -v http://www.example.org
curl --verbose http://www.example.org

Status akan muncul di header. Misalnya.

< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity

173
2018-05-03 04:28



+1 untuk menunjukkan bendera verbose memberikan detail tambahan. Bagus untuk menguji aplikasi REST. - MrOodles
+1 sangat mudah digunakan saat melakukan permintaan POST (curl -v --data "...") - MegaTux
Bahkan membagi mereka dalam dua output file yang berbeda (rincian status http ke stderr dan respon body ke stdout) - Blauhirn


Anda dapat mencetak kode status, selain semua header dengan melakukan hal berikut:

curl -i http://example.org

Hal yang bagus tentang -i adalah bahwa ia bekerja dengan -X POST demikian juga.


144
2017-12-04 20:45



Jauh lebih baik daripada jawaban yang diterima (yang melakukan permintaan HEAD). - neu242
Mungkin sudah jelas, tapi -i bekerja dengan apa saja Metode HTTP, bukan hanya GET dan POST... :) - mac
jawaban terbaik karena membuat output curl baik header dan body, sehingga cocok untuk sebagian besar tugas saat digunakan dalam skrip - Sarge Borsch
Ini adalah jawaban terbaik, dan dapat digunakan bersama -s (jangan tampilkan progres meter atau pesan kesalahan) dan -S(jangan tampilkan pesan kesalahan setelah semua) - Jonathan Hartley


Jika Anda ingin menangkap kode status HTTP dalam variabel, tetapi masih mengalihkan konten ke STDOUT, Anda harus membuat dua STDOUT. Anda dapat melakukannya dengan substitusi proses> () dan penggantian perintah $ ().

Pertama, buat deskriptor file 3 untuk proses Anda saat ini 'STDOUT dengan exec 3>&1.

Kemudian, gunakan curl's -o pilihan untuk mengarahkan konten tanggapan ke fifo sementara menggunakan substitusi perintah, dan kemudian dalam substitusi perintah itu, mengarahkan kembali output ke proses deskriptor file STDOUT Anda saat ini 3 dengan -o >(cat >&3).

Menyatukan semuanya:

#creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1 
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')

45
2018-01-08 20:59



Itu benar-benar licik ... dan aku menyukainya! - spyle
Sekarang bagaimana, pada gilirannya, dapatkah saya mengalihkan output ke variabel lain? - Roger Filmyer
Output masuk STDOUT, jadi Anda harus dapat mengalihkan output dari perintah ke mana saja Anda suka seperti perintah biasa. Saya belum menguji ini. - Heath Borders


Menetapkan keluaran curl:

curl -sw '%{http_code}' http://example.org

Dapat digunakan dengan jenis permintaan apa pun.


26
2017-08-05 18:18



-k (--insecure) mengesampingkan -s (diam). - Ravichandra


Ini akan mengirim permintaan ke url, dapatkan hanya baris pertama dari respons, pisahkan pada blok dan pilih yang kedua.

Ini berisi kode respon

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2

10
2017-07-15 20:08



Bisakah Anda menjelaskan apa yang dilakukan kode ini dan bagaimana ia mengatasi masalah yang diberikan oleh OP? Kode yang tidak dapat dijelaskan dapat muncul tidak tepercaya dan berbahaya bagi pengguna. - bwDraco
Tentu, kami mengirim permintaan ke url, dapatkan hanya baris pertama dari tanggapan, membaginya di blok dan pilih yang kedua. Ini berisi kode respon yang dicari oleh OP. - Filip Spiridonov