Perl::Dancer как включить путь к файлу в качестве параметра в URI

Я новичок в фреймворке Dancer и веб-приложениях в целом. У меня есть проект Dancer, в котором есть маршрут, который принимает несколько параметров. Пока что без пота. Однако, если в качестве значения одного из параметров указан путь к файлу, маршрут не будет найден.

Я попытался закодировать строку параметра следующим образом, чтобы исключить косую черту:

$paramString =~ s/\//%2F/g;

и это действительно кодирует косые черты, как и ожидалось (я распечатываю это в журнале, чтобы убедиться).

Однако после добавления строки параметра к базовому URI для интересующего меня маршрута URI отображается в браузере в незакодированном виде, возникает ошибка 404, а в журнале говорится, что незакодированный маршрут не может быть найден .

Я заглянул в модуль Request.pm и обнаружил, что в методе init вызывается приватный метод _url_decode, который удаляет кодировку. Есть ли способ отключить это, когда это не желательно?

Я также пытался использовать метод uri_for для создания URI. В этом случае закодированный URI отображается в браузере, однако маршрут по-прежнему не найден, и в журнале указано, что для поиска маршрута используется незакодированная форма (с косой чертой).

Trying to match 'GET /exome_proj_config/project_type=exome&project_root=/usr/local/projects/users/pdagosto/projects&analysis_project_name=Test' against /^\/exome_proj_config\/([^\/]+)$/ (generated from '/exome_proj_config/:project_type:project_root:analysis_project_name') in /home/pdagosto/perl5/lib/perl5/Dancer/Route.pm l. 84 here

Поскольку регулярное выражение, используемое для сопоставления, явно ищет строку без косой черты после строки в конце базового URI, ясно, что маршрут никогда не будет найден.

Есть ли способ получить параметр URI, содержащий путь, или нужно использовать какой-то другой подход?


person roadrider    schedule 10.07.2013    source источник
comment
Вы пытаетесь скачать файл с сервера? В таком случае вы действительно хотите предоставить клиенту структуру папок на сервере? Я знаю, что это не дает прямого ответа на вопрос, но с точки зрения дизайна службы REST кажется неправильным, что вы включаете путь к файлу в URI. Может ли ваш клиент POST и указать путь к файлу в теле?   -  person Ross Attrill    schedule 11.07.2013
comment
Нет, это не связано с загрузкой файлов, службами REST или подобной ерундой. Я не ищу комментариев по дизайну и характеру приложения, чтобы объяснять его слишком долго, и это не имеет отношения к проблеме. Достаточно сказать, что это полностью внутреннее приложение, а не веб-сайт, просто графический интерфейс для внутреннего приложения. Все, что я ищу, - это простой ответ на вопрос, возможно ли иметь параметр URL, который имеет значение с косой чертой, и если да, то как это сделать. Это все, что меня интересует.   -  person roadrider    schedule 11.07.2013
comment
Приношу свои извинения за поспешные выводы. Я разместил решение ниже, которое должно работать, я надеюсь.   -  person Ross Attrill    schedule 15.07.2013
comment
Связанная проблема с Dancer github: github.com/PerlDancer/Dancer2/issues/1050   -  person Relequestual    schedule 18.11.2015


Ответы (1)


Можно использовать URI с путем к файлу или косой чертой в параметре при условии, что параметр является частью строки запроса, а не пути. (См. http://en.wikipedia.org/wiki/Uniform_resource_locator.)

Например, посмотрите этот скрипт Dancer:

use strict;
use warnings;
use Dancer;

get '/file/action/:action' => sub {
    my $filename = param('filename');
    my $action = param('action');
    return "Filename is $filename and action is $action";
};

dance;

Если вы поместите эту строку в браузер

http://localhost:3000/file/action/delete?filename=/folder/filename.txt

то вы должны ожидать увидеть это:

Filename is /folder/filename.txt and action is delete

В вашем вопросе URL-адрес, который вы показываете, использует символ & для разделения параметров, но похоже, что вам нужен? первым символом, чтобы отделить строку запроса от пути. Из вашего вопроса неясно, как вы создаете свои запросы, но при условии, что вы можете поместить имя файла в часть строки запроса URL-адреса, тогда подход, описанный выше, должен работать.

person Ross Attrill    schedule 15.07.2013
comment
Метод uri_for в среде Dancer вставляет ? перед строкой запроса, но это не решает проблему, которая, как мне кажется, не является общей проблемой URL-адреса, а является проблемой в самой структуре Dancer. Как указано в исходном вопросе, регулярное выражение, которое Dancer использует для поиска маршрута, специально исключает косую черту. Я думаю, что мы можем позволить это, поскольку я разработал обходной путь, который не включает передачу интересующих меня данных с использованием строк запроса. Спасибо за вашу помощь. - person roadrider; 15.07.2013
comment
@roadrider Не могли бы вы опубликовать свое решение в качестве ответа? Это нормально, если вы найдете решение! - person Relequestual; 18.11.2015