Jaka jest różnica między URI.escape
i, CGI.escape
a którego należy użyć?
147
Były pewne drobne różnice, ale ważne jest to, że URI.escape
została zaniechana w Ruby 1.9.2 ... więc używać CGI::escape
lub ERB :: Util.url_encode .
Dla zainteresowanych istnieje długa dyskusja na temat ruby-core, w której wspomina się również o WEBrick :: HTTPUtils.escape i WEBrick :: HTTPUtils.escape_form .
ERB::Util.url_encode
tego, co właściwie używa%20
do spacjiJaka jest różnica między toporem a mieczem i którego powinienem użyć? To zależy od tego, co musisz zrobić.
URI.escape
miał zakodować ciąg znaków (URL) w tzw. „ kodowaniu procentowym ”.CGI::escape
pochodzi ze specyfikacji CGI , która opisuje sposób kodowania / dekodowania danych między serwerem WWW a aplikacją.Teraz załóżmy, że musisz uciec przed identyfikatorem URI w swojej aplikacji. Jest to bardziej szczegółowy przypadek użycia. W tym celu społeczność Ruby używana
URI.escape
przez lata. ProblemURI.escape
polegał na tym, że nie mógł obsłużyć specyfikacji RFC-3896.URI.escape
został oznaczony jako przestarzały:Niestety w dokumentach nie ma ani słowa na ten temat, jedynym sposobem, aby się o tym dowiedzieć, jest sprawdzenie źródła lub uruchomienie skryptu z ostrzeżeniami na poziomie szczegółowym (
-wW2
) (lub użycie jakiegoś google-fu).Niektórzy proponowali użycie
CGI::Escape
jako parametrów zapytania, ponieważ nie można było uciec przed całym identyfikatorem URI:CGI::escape
powinien być używany tylko dla parametrów zapytania, ale wyniki będą ponownie niezgodne ze specyfikacją. W rzeczywistości najczęstszym przypadkiem użycia jest ucieczka przed danymi z formularza, na przykład podczas wysyłaniaapplication/x-www-form-urlencoded
żądania POST.Wspomniano również o
WEBrick::HTTPUtils.escape
niewielkiej poprawie (znowu to po prostu prostagsub
, czyli IMO, nawet gorsza opcja niżURI.escape
):Najbardziej zbliżony do specyfikacji wydaje się klejnot adresowalny :
Zwróć uwagę, że w przeciwieństwie do wszystkich poprzednich opcji, Adresowalne nie zmienia znaczenia
#
i jest to oczekiwane zachowanie. chcesz zachować#
skrót w ścieżce URI, ale nie w zapytaniu URI.Jedynym problemem, jaki pozostał, jest to, że nie pominęliśmy poprawnie naszych parametrów zapytania, co prowadzi nas do wniosku: nie powinniśmy używać jednej metody dla całego identyfikatora URI, ponieważ nie ma (jak dotąd) idealnego rozwiązania. Jak widzisz,
&
nie został zmieniony z „Mój blog i Twój blog”. Musimy użyć innej formy ucieczki dla parametrów zapytania, gdzie użytkownicy mogą umieszczać różne znaki o specjalnym znaczeniu w adresach URL. Wpisz kodowanie adresu URL. Kodowanie adresu URL powinno być używane dla każdej „podejrzanej” wartości zapytania, podobnie jak w przypadkuERB::Util.url_encode
:To fajne, ale już wymagaliśmy Adresowalny:
Wniosek:
URI.escape
ani podobnychCGI::escape
jeśli potrzebujesz tylko ucieczki z formyźródło
Addressable
jednego ze swoich klejnotów, możesz najpierw przeanalizować adres URL, fi rubydoc.info/gems/addressable/Addressable/URI.heuristic_parseAddressable:URL
, możesz wtedy wywołać wszystkie metody instancji na niej, może jedna z nich przyniesie pożądane rezultaty: rubydoc.info/gems/addressable/Addressable/URIURI.escape przyjmuje drugi parametr, który pozwala oznaczyć, co jest niebezpieczne. Zobacz APIDock:
http://apidock.com/ruby/CGI/escape/class
http://apidock.com/ruby/URI/Escape/escape
źródło
CGI::escape
jest dobry do zmiany znaczenia segmentów tekstu, aby można ich było używać w parametrach zapytania URL (ciągi znaków po znaku „?”). Na przykład, jeśli chcesz, aby parametr zawierał znaki ukośnika w adresie URL, najpierw CGI :: zmieniamy znaczenie tego ciągu, a następnie wstawiamy go do adresu URL.Jednak w Railsach prawdopodobnie nie będziesz go używać bezpośrednio. Zwykle używasz tego
hash.to_param
, który będzie używanyCGI::escape
pod maską.URI::escape
jest dobry do ucieczki przed adresem URL, który nie został poprawnie zmieniony. Na przykład niektóre witryny wyświetlają nieprawidłowy adres URL bez zmiany znaczenia w tagu kotwicy. Jeśli Twój program używa tych adresów URL do pobierania większej liczby zasobów, OpenURI będzie narzekać, że adresy URL są nieprawidłowe. MusiszURI::escape
to zrobić, aby był prawidłowym adresem URL. Jest więc używany do zmiany znaczenia całego ciągu URI, aby był poprawny. Moim słowem URI :: unescape czyni adres URL czytelnym dla człowieka, a URI :: escape czyni go poprawnym dla przeglądarek.To jest termin mojego laika i nie krępuj się go poprawić.
źródło
Różnica polega na tym, że URI.escape nie działa ...
źródło
CGI.escape służy do zmiany znaczenia adresu URL w ciągu zapytania. Wszystkie znaki, które nie należą do ALPHA, DIGIT, '_', '-', ''. i zestaw znaków „” są chronione.
Ale to spowodowałoby, że adres URL byłby nieprawidłowy, ponieważ adres URL musi zawierać znaki „/”, „:”, „?”, „[”, „&”, „=” I „;”. Może więcej, niż nie mogę wymyślić z czubka głowy.
URI.escape pozostawia te znaki adresu URL w spokoju i próbuje znaleźć klucze ciągu zapytania i wartości, które mają zostać usunięte. Jednak naprawdę nie można na tym polegać, ponieważ wartości mogą mieć różne rodzaje znaków, uniemożliwiające łatwą ucieczkę. Zasadniczo jest już za późno. Ale jeśli można polegać na prostocie adresu URL (brak znaków „&” i „=” itp. W wartościach), ta funkcja może zostać użyta do uniknięcia być może nieczytelnych lub niedozwolonych znaków.
Ogólnie - zawsze używaj CGI.escape na poszczególnych kluczach i wartościach przed połączeniem ich za pomocą „&” i dodaniem ich po „?”.
źródło
CGI.escape nie działał z API OpenProject. Zakodował [], a nie +. Zhakowałem to razem, co wydaje się działać do tej pory dla API OpenProject. Ale jestem pewien, że brakuje niektórych plików .gsub. Prawdopodobnie jest prawie tak zły, jak URI.escape, ale nie da ci przestarzałych błędów.
Oba wyjścia:
=> " http://test.com/some/path?query=[box:%20%22cart%22] "
=> " http://test.com/some/path?query=[box:%20 % 22cart% 22] "
źródło