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

标签 perl uri parameters dancer

我对 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/

相关文章:

perl - 为什么我的排序不能在 Perl 中工作?

perl - 为什么 md5 与 Perl 的 Digest::MD5 输出不匹配?

regex - 如何在正则表达式中将变量插值延迟到使用点?

perl - 有效处理 lwp 超时

parameters - 是否可以将参数传递给 F# 模块?

ios - 如何在 REST api 中处理 URI?

android - UriMatcher Uri *和#区别

uri - 在 dropwizard 中为 REST web 服务配置 URI 前缀

c# - 通过连接字符串或连接对象设置 MySQL 变量?

c++ - 检查 char * 类型的字符串是否包含另一个字符串