Какая разница между топором и мечом, и какой мне следует использовать? Ну, это зависит от того, что вам нужно сделать.
URI.escape
должен был закодировать строку (URL) в так называемое " Процентное кодирование ".
CGI::escape
взято из спецификации CGI , которая описывает, как данные должны кодироваться / декодироваться между веб-сервером и приложением.
Теперь, допустим, вам нужно экранировать URI в вашем приложении. Это более конкретный вариант использования.
Для этого сообщество Ruby годами использовало URI.escape
. Проблема с URI.escape
заключалась в том, что он не мог обработать спецификацию RFC-3896.
URI.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http://google.com/foo?bar=at%23anchor&title=My%20Blog%20&%20Your%20Blog"
URI.escape
помечен как устаревший:
Более того, текущий URI.encode - это простой gsub. Но я думаю, что это должно
разделить URI на компоненты, затем экранировать каждый компонент и, наконец,
присоединяйтесь к ним.
Таким образом, текущий URI.encode считается вредоносным и устаревшим. Это будет
быть удаленным или радикально изменить поведение.
Какая замена в это время?
Как я уже говорил выше, текущий URI.encode неверен на уровне спецификации. Итак, мы
не предоставит точную замену. Замена будет варьироваться в зависимости от его
случай использования.
https://bugs.ruby -lang.org / вопросы / 4167
К сожалению, в документации нет ни единого слова об этом, единственный способ узнать об этом - проверить исходный код или запустить скрипт с предупреждениями на подробном уровне (-wW2
) (или использовать какой-нибудь google-fu ).
Некоторые предложили использовать CGI::Escape
для параметров запроса, потому что вы не смогли экранировать весь URI:
CGI::escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http%3A%2F%2Fgoogle.com%2Ffoo%3Fbar%3Dat%23anchor%26title%3DMy+Blog+%26+Your+Blog"
CGI::escape
следует использовать только для параметров запроса, но результаты снова будут соответствовать спецификации. На самом деле наиболее распространенным вариантом использования является экранирование данных формы, например, при отправке application/x-www-form-urlencoded
запроса POST.
Также упомянуто WEBrick::HTTPUtils.escape
не так много улучшений (опять же, это просто gsub
, что, IMO, даже хуже, чем URI.escape
):
WEBrick::HTTPUtils.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http://google.com/foo?bar=at%23anchor&title=My%20Blog%20&%20Your%20Blog"
Наиболее близким к спецификации является Addressable gem:
require 'addressable/uri'
Addressable::URI.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http://google.com/foo?bar=at#anchor&title=My%20Blog%20&%20Your%20Blog"
Обратите внимание, что в отличие от всех предыдущих опций Addressable не экранируется #
, и это ожидаемое поведение. Вы хотите сохранить хэш #
в пути URI, но не в запросе URI.
Единственная оставшаяся проблема заключается в том, что мы не экранировали параметры нашего запроса должным образом, что приводит нас к выводу: нам не следует использовать один метод для всего URI, поскольку не существует идеального решения (пока).
Как видите, &
не сбежал из "Моего блога и вашего блога". Нам нужно использовать другую форму экранирования для параметров запроса, где пользователи могут помещать в URL разные символы, которые имеют особое значение. Введите URL кодировать. URL-кодирование должно использоваться для каждого «подозрительного» значения запроса, аналогично тому, что делает ERB::Util.url_encode
:
ERB::Util.url_encode "My Blod & Your Blog"
# => "My%20Blod%20%26%20Your%20Blog""
Это круто, но мы уже требовали Адрес:
uri = Addressable::URI.parse("http://www.go.com/foo")
# => #<Addressable::URI:0x186feb0 URI:http://www.go.com/foo>
uri.query_values = {title: "My Blog & Your Blog"}
uri.normalize.to_s
# => "http://www.go.com/foo?title=My%20Blog%20%26%20Your%20Blog"
Вывод:
- Не использовать
URI.escape
или аналогичный
- Используйте
CGI::escape
, если вам нужен только escape-код
- Если вам нужно работать с URI, используйте Addressable, он предлагает кодировку URL, кодирование формы и нормализует URL.
- Если это проект Rails, посмотрите " Как мне URL-экранировать строку в Rails? "