Perl :: Dancer如何在URI中包含文件路径作为参数

时间:2013-07-10 21:08:48

标签: perl uri params dancer

我是Dancer框架和Web应用程序的新手。我有一个舞者项目,我有一个接受多个参数的路线。到目前为止,没有汗水。但是,如果其中一个参数的文件路径为其值,则找不到该路径。

我尝试按如下方式对参数字符串进行编码以消除正斜杠:

$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参数包含路径或者必须使用其他方法?

1 个答案:

答案 0 :(得分: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的查询字符串部分中,那么上面的方法应该有效。