Saya menjalankan Mac OS 10.11.6 El Capitan. Ada tautan yang ingin saya unduh secara terprogram:
https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
Jika saya menempelkan URL ini ke browser apa pun (misalnya Safari), unduhan berfungsi dengan baik.
Namun, jika saya mencoba mengunduh URL yang sama dari baris perintah dengan menggunakan curl
, itu tidak berfungsi — hasilnya adalah file kosong:
$ ls -lA
$ curl -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
$ ls -lA
total 0
-rw-r--r-- 1 myname staff 0 Nov 7 14:07 mysql-5.7.16-osx10.11-x86_64.dmg
$
Tentu saja saya bisa mendapatkan file melalui browser, tapi saya ingin memahami mengapa para curl
perintah di atas tidak bekerja.
Mengapa tidak dapat curl
mengunduh file ini dengan benar, ketika ternyata ada di situs web dan dapat diakses dan diunduh dengan benar melalui browser web grafis?
User-Agent
. Selain itu, beberapa unduhan browser mungkin berhasil karena cookie sesi (yaitu jika Anda masuk) hanya ada di browser tersebut.curl -v
untuk "verbose". Ini akan mencetak ke kesalahan standar berbagai info tentang koneksi, permintaan, dan respons. Dalam hal ini, Anda akan melihat bahwa responsnya meliputiHTTP 302 Found
(kode arahan) danLocation
header dengan URL untuk pergi. Kemudian Anda bisaman curl
mengetahui cara mengatakannya untuk mengikuti arahan ulang.Jawaban:
Ada redirect pada webserver-sisi ke URL berikut:
http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
. Karena ini adalah CDN, perilaku persis (apakah Anda diarahkan atau tidak) mungkin tergantung pada lokasi Anda.curl
tidak mengikuti arahan ulang secara default. Untuk menyuruhnya melakukannya, tambahkan-L
argumen:sumber
Jika browser dapat mengunduh file, Anda dapat memeriksa apa yang dilakukan browser. Di google chrome Anda dapat menggunakan yang berikut untuk melihat apa yang terjadi.
1) [Lihat> Pengembang> Alat pengembang> Tab Jaringan> tab Header]
2) Klik tautan unduhan.
3) Tautan file akan muncul di tab alat pengembang.
4) Klik kanan pada file dan pilih Copy> Copy as cURL.
Sekarang Anda memiliki tautan ikal yang berfungsi. Mungkin akan memiliki parameter berlebih yang dapat Anda potong.
Lebih detail: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl
sumber
Saya akan mengonversi salah satu komentar pada posting ini menjadi sebuah jawaban.
Ada banyak tautan HTTP / HTTPS yang membutuhkan tajuk tertentu agar dapat berfungsi. Jadi ini akan menghasilkan respons yang berfungsi dari browser web tetapi bukan respons yang berfungsi dalam permintaan web backend seperti curl.
Saya baru saja berlari ke situs yang membutuhkan semua tajuk berikut. Kegagalan untuk menentukan mereka menghasilkan batas waktu.
sumber