2013-07-10 53 views
1

我是新來的Dancer框架和一般的web應用程序。我有一個舞者項目,我有一個接受多個參數的路線。到目前爲止,沒有汗水。但是,如果其中一個參數具有文件路徑作爲其值,則找不到路由。Perl :: Dancer如何在URI中包含文件路徑作爲參數

我已經試過編碼參數字符串如下消除斜線:

$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參數包含一個路徑或者是否需要使用其他方法?

+0

你想從服務器上下載文件嗎?在這種情況下,你真的想將服務器上的文件夾結構暴露給客戶端嗎?我知道這並不直接回答這個問題 - 但在REST服務設計方面,您在URI中包含文件路徑時感覺不對。你的客戶端可以開機並將文件路徑放在主體中? –

+0

不,它不涉及文件下載,REST服務或任何這樣的廢話。我不在尋找關於設計的評論,應用程序的性質將花費太長時間來解釋,並且與問題相關。只需說這是一個完全內部的應用程序,而不是一個網站,僅僅是一個內部應用程序的GUI。我正在尋找的只是一個簡單的答案,它是否可能具有帶正斜槓的值的URL參數,以及如何執行此操作。這就是我感興趣的全部。 – roadrider

+0

我很抱歉跳到結論。我已經發布了一個解決方案,應該可以工作,我希望。 –

回答

1

如果參數是查詢字符串的一部分而不是路徑,則可以在參數中包含一個帶有文件路徑的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 

在您的問題中,您顯示的網址使用& charact呃分開參數,但它看起來像你需要一個?字符首先將查詢字符串從路徑中分離出來。從你的問題來看,你不清楚你是如何創建你的請求的 - 但是假如你可以把這個文件名放在URL的查詢字符串部分,那麼上面的方法應該可以工作。

+0

舞者框架中的uri_for方法插入「?」在查詢字符串之前,但這不能解決我不認爲是通用的URL問題,而是在Dancer框架本身中的問題。正如原始問題中所述,Dancer用於搜索路線的正則表達式明確排除了正斜槓。我認爲我們可以讓我們開發一項工作,而不需要使用查詢字符串來傳遞我感興趣的數據。謝謝你的幫助。 – roadrider

+0

@roadrider你會考慮發佈你的解決方案作爲答案嗎?如果您找到解決方案,那麼可以這樣做! – Relequestual

相關問題