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

Тогда другое приложение может декодировать и использовать?

Https://www.base64encode.org/

2 2

2 ответа:

Правильным способом будет uri-кодирование второго прыжка, как это делается в первом примере. Тот самый URI и еще URI::QueryParam модули делают это приятно и легко:

Чтобы закодировать URI, вы просто создаете объект URI на вашем базовом url. Затем добавьте любые параметры запроса, которые вы хотите. (Примечание: они будут автоматически закодированы uri URI::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.