URI кодирует не кодирующие URL (превращая последние части https:// в закодированные символы)

Вот мой вывод:

URI.encode("http://localhost:3000/membership?referer_invite_code=a03478&fee=UVYA")
=> "http://localhost:3000/membership?referer_invite_code=a03478&fee=UVYA" 

But I need output to be:
=> "http%3A%2F%2Flocalhost%3A3000..."

Причина в том, что я пытаюсь создать встроенную ссылку на твиттер, а твиттер плохо справляется с амперсандами, так что пока кодировка не заменяет & для последнего параметра оплаты с %26 это не сработает. Как это исправить?

РАБОЧЕЕ РЕШЕНИЕ

Rack::Utils.escape("http://localhost:3000/membership?referer_invite_code=a03478&fee=UVYA")

Но я думаю, мне просто любопытно, почему URI.encode не работал

2 ответа

Вы должны использовать URI.encode_www_form_component для этого вместо этого:

URI.encode_www_form_component "http://localhost:3000/membership?referer_invite_code=a03478&fee=UVYA"
=> "http%3A%2F%2Flocalhost%3A3000%2Fmembership%3Freferer_invite_code%3Da03478%26fee%3DUVYA"

Кажется, что URI.encode предназначен для кодирования всего URI для использования в качестве URI, а не для использования в качестве параметра в URI. Он предназначен только для защиты от использования недопустимых символов в URI - не для правильного кодирования параметров URI - поэтому по умолчанию он не кодирует зарезервированные символы, перечисленные здесь.

Вы можете найти больше информации в записи RubyDoc для URI:: Escape. URI.escape принимает необязательное регулярное выражение в качестве второго аргумента. Регулярное выражение указывает, какие символы должны быть закодированы в процентах в результате. Если опущено, по умолчанию URI::UNSAFE используется. В МРТ 2.3.1 это составляет следующее:

/[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]/

Как видите, это не будет соответствовать ни одному из зарезервированных символов для URI. Он защитит вас от создания и использования недопустимого URI. Например:

URI.encode "https://test.com"
=> "https://test.com"

URI.encode "https://testçĕÅ.com/"
=> "https://test%C3%A7%C4%95%C3%85.com/"

Я предполагаю, что вы забыли до этого

require 'uri'
Другие вопросы по тегам