我对 Dancer 框架和 Web 应用程序总体来说是新手。我有一个 Dancer 项目,其中有一条接受多个参数的路线。到目前为止,还没有出汗。但是,如果其中一个参数的值是文件路径,则找不到该路由。
我尝试按如下方式对参数字符串进行编码以消除正斜杠:
$paramString =~ s/\//%2F/g;
这确实按预期对斜杠进行了编码(我将其打印在日志中以确保)。
但是,在将参数字符串附加到我感兴趣的路由的基本 URI 后,该 URI 以未编码的形式显示在浏览器中,引发 404 错误,并且日志显示未编码的路由可以'找不到。
我查看了 Request.pm 模块,发现在 init 方法中调用了一个名为 _url_decode 的私有(private)方法,该方法删除了编码。有没有办法在不需要时禁用它?
我还尝试使用 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 参数包含路径,还是必须使用其他方法?
最佳答案
如果参数是查询字符串而不是路径的一部分,则参数中可以包含带有文件路径或斜杠的 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 的查询字符串部分中,那么上面的方法应该可以工作。
关于Perl::Dancer 如何将文件路径作为参数包含在 URI 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17580916/