Perl: передача URL-адреса в строке запроса
Я пытаюсь передать URL-адрес в виде строки запроса, чтобы он мог быть прочитан другим сайтом, а затем использован:
www.example.com/domain?return_url=/another/domain
Возвращается как:
www.example.com/domain?return_url=%2Fanother%2Fdomain
Есть ли способ, которым этот URL-адрес может быть прочитан и проанализирован другим приложением с помощью экранированных символов?
Единственный способ, который я могу придумать, - это закодировать его так, чтобы он получился таким:
Www.example.com/domain?return_url=L2Fub3RoZXIvZG9tYWlu
Тогда другое приложение может декодировать и использовать?
2 ответа:
Правильным способом будет uri-кодирование второго прыжка, как это делается в первом примере. Тот самый
URI
и ещеURI::QueryParam
модули делают это приятно и легко:Чтобы закодировать
URI
, вы просто создаете объектURI
на вашем базовом url. Затем добавьте любые параметры запроса, которые вы хотите. (Примечание: они будут автоматически закодированы uriURI::QueryParam
):use strict; use warnings; use feature qw(say); use URI; use URI::QueryParam; my $u = URI->new('http://www.example.com/domain'); $u->query_param_append('return_url', 'http://yahoo.com'); say $u->as_string; # http://www.example.com/domain?return_url=http%3A%2F%2Fyahoo.com
Чтобы получить этот url-адрес и затем перенаправить его на
return_url
, вы просто создаете новый объектURI
, а затем выполняете запросreturn_url
параметр сURI::QueryParam
. (Примечание: опять URI:: QueryParam автоматически uri-декодирует параметр для вас):my $u = URI->new( 'http://www.example.com/domain?return_url=http%3A%2F%2Fyahoo.com' ); my $return_url = $u->query_param('return_url'); say $return_url; # http://yahoo.com
Www.example.com/domain?return_url=%2Fanother%2Fdomain
Это называется кодировка URL. Не потому, что вы помещаете в него URL, а потому, что он кодирует символы, которые имеют особое значение в URL.
%2F
соответствует косой черте/
. Вы, вероятно, также видели раньше функцию%20
, которая является функцией пространства.
Putting a complete URI into a URL parameter of another URI is totally fine.
{[0]}The application behind the URL you are calling needs to be able to understand URL encoding, but that is a trivial thing. Typical web frameworks and interfaces to the web (like CGI.pm or Plack in Perl) will do that. You should not have to care about it a all.
To URL-encode something in Perl, you have several options.
You could use the URI module to create the whole URI including the URL encoded query.
{[1]}This seems like the natural thing to do.
You could also use the URI::Encode module, which gives you a
uri_encode
. Это полезно, если вы хотите кодировать строки без создания объекта URI.use URI::Encode qw(uri_encode uri_decode); my $encoded = uri_encode($data); my $decoded = uri_decode($encoded);
Все это нормально. часть того, как работает сеть. Нет необходимости делать кодировку Base 64.