Apa perbedaan antara URI.escape
dan CGI.escape
dan mana yang harus saya gunakan?
147
Ada beberapa perbedaan kecil, tetapi poin pentingnya adalah yang URI.escape
sudah usang di Ruby 1.9.2 ... jadi gunakan CGI::escape
atau ERB :: Util.url_encode .
Ada diskusi panjang tentang ruby-core untuk mereka yang tertarik yang juga menyebutkan WEBrick :: HTTPUtils.escape dan WEBrick :: HTTPUtils.escape_form .
ERB::Util.url_encode
yang benar digunakan%20
untuk ruangApa perbedaan antara kapak dan pedang dan yang mana yang harus saya gunakan? Yah itu tergantung pada apa yang perlu Anda lakukan.
URI.escape
seharusnya menyandikan string (URL) ke, yang disebut, " Persen-encoding ".CGI::escape
datang dari spec CGI , yang menjelaskan bagaimana data harus dikodekan / decode antara server web dan aplikasi.Sekarang, katakanlah Anda harus keluar dari URI di aplikasi Anda. Ini adalah kasus penggunaan yang lebih spesifik. Untuk itu, komunitas Ruby digunakan
URI.escape
selama bertahun-tahun. MasalahnyaURI.escape
adalah tidak bisa menangani spesifikasi RFC-3896.URI.escape
ditandai sebagai usang:Sayangnya tidak ada satu kata pun tentang hal itu di dokumen, satu-satunya cara untuk mengetahuinya adalah dengan memeriksa sumbernya, atau menjalankan skrip dengan peringatan di tingkat verbose (
-wW2
) (atau menggunakan beberapa google-fu).Beberapa mengusulkan untuk menggunakan
CGI::Escape
parameter kueri, karena Anda tidak dapat menghindari seluruh URI:CGI::escape
harus digunakan hanya untuk parameter kueri, tetapi hasilnya akan, sekali lagi, berlawanan dengan spesifikasi. Sebenarnya use-case yang paling umum adalah melarikan diri data formulir, seperti saat mengirimapplication/x-www-form-urlencoded
permintaan POST.Disebutkan
WEBrick::HTTPUtils.escape
juga tidak banyak perbaikan (sekali lagi itu hanya sederhanagsub
, yaitu, IMO, bahkan pilihan yang lebih buruk daripadaURI.escape
):Yang paling dekat dengan spec tampaknya adalah permata yang dapat dialamatkan :
Perhatikan, bahwa tidak seperti semua opsi sebelumnya, Addressable tidak luput
#
, dan ini adalah perilaku yang diharapkan. Anda ingin menyimpan#
hash di jalur URI tetapi tidak di kueri URI.Satu-satunya masalah yang tersisa adalah bahwa kami tidak lolos parameter kueri kami dengan benar, yang membawa kami pada kesimpulan: kita tidak boleh menggunakan metode tunggal untuk seluruh URI, karena tidak ada solusi yang sempurna (sejauh ini). Seperti yang Anda lihat
&
tidak luput dari "Blog Saya & Blog Anda". Kita perlu menggunakan bentuk pelolosan yang berbeda untuk permintaan, di mana pengguna dapat menempatkan karakter berbeda yang memiliki arti khusus dalam URL. Masukkan penyandian URL. Pengkodean URL harus digunakan untuk setiap nilai permintaan "mencurigakan", mirip dengan apa yangERB::Util.url_encode
dilakukan:Ini keren tapi kami sudah meminta Addressable:
Kesimpulan:
URI.escape
atau serupaCGI::escape
jika Anda hanya perlu pelarian bentuksumber
Addressable
salah satu permata Anda, Anda dapat mengurai URL terlebih dahulu, fi rubydoc.info/gems/addressable/Addressable/URI.heuristic_parseAddressable:URL
, Anda kemudian dapat memanggil semua metode instance di atasnya, mungkin salah satu dari mereka akan memberi Anda hasil yang diinginkan: rubydoc.info/gems/addressable/Addressable/URIURI.escape mengambil parameter kedua yang memungkinkan Anda menandai apa yang tidak aman. Lihat APIDock:
http://apidock.com/ruby/CGI/escape/class
http://apidock.com/ruby/URI/Escape/escape
sumber
CGI::escape
bagus untuk keluar dari segmen teks sehingga mereka dapat digunakan dalam parameter kueri url (string setelah '?'). Misalnya jika Anda ingin memiliki parameter yang mengandung karakter slash di url, Anda CGI :: keluar dari string itu terlebih dahulu dan kemudian masukkan dalam url.Namun di Rails Anda mungkin tidak akan menggunakannya secara langsung. Biasanya Anda gunakan
hash.to_param
, yang akan digunakan diCGI::escape
bawah tenda.URI::escape
bagus untuk keluar dari url yang tidak lolos dengan benar. Misalnya beberapa situs web menampilkan url yang salah / tidak terhapus di tag jangkar mereka. Jika program Anda menggunakan url ini untuk mengambil lebih banyak sumber daya, OpenURI akan mengeluh bahwa url tidak valid. Anda perluURI::escape
ini untuk menjadikannya url yang valid. Jadi itu digunakan untuk melarikan diri dari seluruh string URI untuk membuatnya lebih baik Dalam kata-kata saya URI :: unescape membuat url dapat dibaca oleh manusia, dan URI :: escape membuatnya valid untuk browser.Ini adalah istilah awam saya dan merasa bebas untuk memperbaikinya.
sumber
Perbedaannya adalah bahwa URI.escape tidak berfungsi ...
sumber
CGI.escape adalah untuk keluar dari nilai URL dalam string kueri. Semua karakter yang tidak termasuk dalam ALPHA, DIGIT, '_', '-', '.' dan '' rangkaian karakter diloloskan.
Tetapi itu akan membuat URL salah, karena url perlu memiliki '/', ':', '?', '[', '&', '=', Dan ';'. Mungkin lebih dari yang saya tidak bisa memikirkan bagian atas kepala saya.
URI.escape meninggalkan karakter URL itu sendiri, dan mencoba menemukan kunci dan nilai string kueri untuk melarikan diri. Namun ini benar-benar tidak dapat diandalkan karena nilai dapat memiliki semua jenis karakter yang mencegah pelarian yang mudah. Pada dasarnya, ini sudah terlambat. Tetapi jika URL dapat dijadikan sederhana (tidak ada '&' dan '=' dll dalam nilai-nilai), fungsi ini dapat digunakan untuk keluar dari karakter yang mungkin tidak terbaca atau ilegal.
Secara umum - selalu gunakan CGI.escape pada kunci dan nilai individual sebelum bergabung dengan '&' dan menambahkannya setelah '?'.
sumber
CGI.escape tidak berfungsi dengan OpenProject API. Itu mengkodekan [] ,: dan bukan +. Saya meretas ini bersama yang tampaknya bekerja sejauh ini untuk OpenProject's API. Tapi saya yakin itu kehilangan beberapa .gsub. Kemungkinannya hampir sama buruknya dengan URI.escape, tetapi itu tidak akan memberi Anda kesalahan yang usang.
Kedua output:
=> " http://test.com/some/path?query=[box:%20%22cart%22] "
=> " http://test.com/some/path?query=[box:%20 % 22mulai% 22] "
sumber