2

一般来说,我是 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 参数包含路径或必须使用其他方法?

4

1 回答 1

3

如果参数是查询字符串的一部分而不是路径的一部分,则可以在参数中包含带有文件路径或斜杠的 URI。(见http://en.wikipedia.org/wiki/Uniform_resource_locator。)

例如看这个舞者脚本:

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 的查询字符串部分,那么上述方法应该可以工作。

于 2013-07-15T04:23:28.250 回答