Curl untuk mengembalikan kode status http bersama dengan responsnya


113

Saya menggunakan curl untuk mendapatkan header http untuk menemukan kode status http dan juga mengembalikan respons. Saya mendapatkan header http dengan perintah

curl -I http://localhost

Untuk mendapat respon, saya menggunakan perintah

curl http://localhost

Segera setelah menggunakan flag -I, saya hanya mendapatkan header dan responsnya tidak lagi ada. Apakah ada cara untuk mendapatkan respons http dan kode status header / http dalam satu perintah?


1
Berikut cuplikan yang sangat berguna gist.github.com/maxcnunes/9f77afdc32df354883df
rocketspacer

Jawaban:


113

Saya bisa mendapatkan solusi dengan melihat dokumen curl yang menentukan untuk digunakan -untuk keluaran untuk mendapatkan keluaran ke stdout.

curl -o - http://localhost

Untuk mendapatkan respon hanya dengan kode http return, saya bisa melakukannya

curl -o /dev/null -s -w "%{http_code}\n" http://localhost

14
atau Anda akan menggunakan -i. Atau mungkin -vjika Anda juga menyukai beberapa info tambahan.
Daniel Stenberg

2
Terima kasih @DanielStenberg. Jawaban yang diterima tidak berhasil untuk saya, cukup menggunakan -i sudah berhasil.
Alejandro Cotilla

perintah kedua Anda tidak ada -Saya @randominstanceOfLivingThing, kecuali jika itu sengaja merupakan opsi kosong? Tidak bekerja untuk saya tanpanya
mdo123

2
-o -Iakhirnya membuat file bernama secara harfiah ' -I' di CWD. Apakah ada orang lain yang melihat ini? Solusi untuk itu adalah-o/dev/null -I
JDS

Menghapus -I. Saya perhatikan dan diperbaiki sekarang. Anda tidak membutuhkan -I.
randominstanceOfLivingThing


36

Saya menggunakan perintah ini untuk mencetak kode status tanpa keluaran lainnya. Selain itu, ini hanya akan melakukan permintaan HEAD dan mengikuti pengalihan (masing -I- masing dan -L).

curl -o -I -L -s -w "%{http_code}" http://localhost

Ini membuatnya sangat mudah untuk memeriksa kode status dalam skrip kesehatan:

sh -c '[ $(curl -o -I -L -s -w "%{http_code}" http://localhost) -eq 200 ]'

5
Ini sudah dijawab setahun yang lalu. Nilai baru apa yang dibawa oleh jawaban Anda? Juga tolong tuliskan penjelasan untuk jawaban Anda.
Maciej Jureczko

11
@MaciejJureczko - Nilainya sederhana. Untuk tujuan pembuatan skrip, jawaban ini adalah yang terbaik dari semua jawaban lainnya, karena memberikan kode status tunggal, bukan banyak baris sampah bersama dengan kode status tersebut.
aggregate1166877

2
Tapi OP secara khusus menyatakan bahwa mereka ingin kedua kode status dan respon tubuh. Mereka tahu bagaimana mendapatkan kode respon (dinyatakan dalam pertanyaan)
wottle

2
Setiap kali saya menggunakan ini, curl -o -I -L -s -w "%{http_code}" http://localhostsebuah file dibuat bernama -I, untuk menyiasati ini saya menambahkan tempat untuk output file yang tersirat oleh -opergi, yaitu /dev/null:curl -o /dev/null -I -L -s -w "%{http_code}" http://localhost
Thismatters

HEAD tidak akan selalu menghasilkan keluaran yang sama dengan permintaan, tergantung pada server bagaimana mereka menanggapinya. Jadi ini bukanlah jawaban yang sebenarnya.
Eddie

28

Saya menemukan pertanyaan ini karena saya ingin KEDUA tanggapan dan konten untuk menambahkan beberapa penanganan kesalahan bagi pengguna.

Anda dapat mencetak kode status HTTP ke std out dan menulis isinya ke file lain.

curl -s -o response.txt -w "%{http_code}" http://example.com

Ini memungkinkan Anda menggunakan logika untuk memutuskan apakah responsnya layak untuk diproses.

http_response=$(curl -s -o response.txt -w "%{http_code}" http://example.com)
if [ $http_response != "200" ]; then
    # handle error
else
    echo "Server returned:"
    cat response.txt    
fi

apa itu http_code? Saya tidak mengerti ini, perlu penjelasan lebih lanjut, tolong
Alexander Mills

diklarifikasi di atas, ini mengacu pada kode Status HTTP - developer.mozilla.org/en-US/docs/Web/HTTP/Status
Eddie

22

The -ipilihan adalah salah satu yang Anda inginkan:

curl -i http://localhost

-i, --include Sertakan header protokol dalam output (H / F)

Sebagai alternatif, Anda dapat menggunakan opsi verbose:

curl -v http://localhost

-v, --verbose Jadikan operasi lebih banyak bicara


16

Saya telah menggunakan ini:

    request_cmd="$(curl -i -o - --silent -X GET --header 'Accept: application/json' --header 'Authorization: _your_auth_code==' 'https://example.com')"

Untuk mendapatkan status HTTP

    http_status=$(echo "$request_cmd" | grep HTTP |  awk '{print $2}')
    echo $http_status

Untuk mendapatkan respon tubuh saya telah menggunakan ini

    output_response=$(echo "$request_cmd" | grep body)
    echo $output_response

8

Perintah ini

 curl http://localhost -w ", %{http_code}"

akan mendapatkan badan dan status yang dipisahkan koma; Anda dapat membaginya untuk dikeluarkan.

Anda dapat mengubah pembatas sesuka Anda.


2
petunjuk bagus! apakah mungkin untuk menambahkan kode status di depan keluaran?
Psikozoikum

6

Untuk penggunaan terprogram, saya menggunakan yang berikut ini:

curlwithcode() {
    code=0
    # Run curl in a separate command, capturing output of -w "%{http_code}" into statuscode
    # and sending the content to a file with -o >(cat >/tmp/curl_body)
    statuscode=$(curl -w "%{http_code}" \
        -o >(cat >/tmp/curl_body) \
        "$@"
    ) || code="$?"

    body="$(cat /tmp/curl_body)"
    echo "statuscode : $statuscode"
    echo "exitcode : $code"
    echo "body : $body"
}

curlwithcode https://api.github.com/users/tj

Ini menunjukkan output berikut:

statuscode : 200
exitcode : 0
body : {
  "login": "tj",
  "id": 25254,
  ...
}

5

Ini adalah cara untuk mengambil tubuh "DAN" kode status dan memformatnya ke json yang tepat atau format apa pun yang sesuai untuk Anda. Beberapa orang mungkin berpendapat itu adalah penggunaan yang salah dari opsi format tulis tetapi ini berfungsi untuk saya ketika saya membutuhkan kode tubuh dan status di skrip saya untuk memeriksa kode status dan menyampaikan kembali tanggapan dari server.

curl -X GET -w "%{stderr}{\"status\": \"%{http_code}\", \"body\":\"%{stdout}\"}"  -s -o - https://github.com 2>&1

jalankan kode di atas dan Anda harus mendapatkan kembali json dalam format ini:

{
"status" : <status code>,
"body" : <body of response>
}

dengan opsi format tulis -w, karena stderr dicetak terlebih dahulu, Anda dapat memformat keluaran Anda dengan var http_code dan menempatkan isi respons dalam sebuah nilai (body) dan menindaklanjuti lampiran menggunakan var stdout. Kemudian alihkan output stderr Anda ke stdout dan Anda akan dapat menggabungkan http_code dan response body menjadi output yang rapi


1
Mendapat kesalahan berikut - curl: unknown --write-out variable: 'stderr'dancurl: unknown --write-out variable: 'stdout'
ALex_hha

curl.haxx.se/docs/manpage.html halaman manual menunjukkan variabel yang tersedia. tidak yakin mengapa stderr tidak dikenali oleh curl Anda, curl im di macbook. Dari dokumen Linux curl ini, computerhope.com/unix/curl.htm , saya juga tidak melihat stderr sebagai variabel. Mungkin ini adalah variasi OS.
Huy Tran

Satu-satunya masalah yang saya miliki dengan ini adalah jika tubuh Anda memiliki tanda kutip, seperti jika json-nya, tubuh akan membuat respons json di atas json tidak valid
theannouncer

cukup adil @ theannouncer, saya berharap dev menyesuaikannya karena tidak semua tanggapan akan menjadi standar json. Ada beberapa contoh yang harus saya sesuaikan karena sifat tanggapannya.
Huy Tran

2

Cara saya untuk mencapai ini :

Untuk mendapatkan keduanya (header dan body), saya biasanya melakukan curl -D- <url>seperti di:

$ curl -D- http://localhost:1234/foo
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 20:59:21 GMT

{"data":["out.csv"]}

Ini akan membuang header ( -D) ke stdout ( -) (Cari --dump-headerdi man curl ).

IMHO juga sangat berguna dalam konteks ini:

Saya sering menggunakan jq untuk mendapatkan data json (misalnya dari beberapa API lainnya) diformat. Tetapi karena jq tidak mengharapkan header HTTP, triknya adalah mencetak header ke stderr menggunakan -D/dev/stderr. Perhatikan bahwa kali ini kami juga menggunakan -sS(--silent, --show-error) untuk menekan pengukur kemajuan (karena kami menulis ke pipa).

$ curl -sSD/dev/stderr http://localhost:1231/foo | jq .
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 21:08:22 GMT

{
  "data": [
    "out.csv"
  ]
}

Saya kira ini juga dapat berguna jika Anda ingin mencetak header (untuk pemeriksaan cepat) ke konsol tetapi mengarahkan isi ke file (misalnya ketika semacam biner untuk tidak mengacaukan terminal Anda):

$ curl -sSD/dev/stderr http://localhost:1231 > /dev/null
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 21:20:02 GMT

Waspada: Ini TIDAK sama dengan curl -I <url>! As -Iakan melakukan HEADpermintaan dan bukan GETpermintaan (Cari --headdi man curl . Ya: Untuk sebagian besar server HTTP, ini akan menghasilkan hasil yang sama. Tapi saya tahu banyak aplikasi bisnis yang tidak mengimplementasikan HEADpermintaan sama sekali ;-P


-2
while : ; do curl -sL -w "%{http_code} %{url_effective}\\n" http://host -o /dev/null; done

1
Mengapa Anda menempatkan ini dalam loop sementara? Harap kembangkan dan jelaskan jawaban Anda.
Uberhumus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.