2016-01-06 147 views
1

我使用的Restlet時遇到與它的變量在模板中包含編碼斜槓路由器模板問題接受編碼的斜線。以下是詳細信息:org.restlet.routing.Router似乎並不

當我使用這條路線:

/blob/sqlserver/{uniqueid} 

而且通過這個(注%2F爲/):

/blob/sqlserver/Refinance-Other%2FFRM%2F660-700%2F4.00-4.50%2Fproperties-4.00-4.50.csv 

或本:

/blob/sqlserver/Refinance-Other/FRM/660-700/4.00-4.50/properties-4.00-4.50.csv 

我得到一個404

如果我使用這個路由器:

/blob/sqlserver/{purpose}/{type}/{creditscore}/{interestrate}/{file} 

,並通過這樣的:

/blob/sqlserver/Refinance-Other/FRM/660-700/4.00-4.50/properties-4.00-4.50.csv 

它的工作原理,但我不能做這種方式,因爲我不控制誰送我這個URI和變量都會發生變化,所以它必須是編碼的斜線。

爲了測試這個進一步的我也再一次嘗試這個模板:

/blob/sqlserver/{uniqueid} 

而且還採用了MODE_STARTS_WITH

.setMatchingMode(Template.MODE_STARTS_WITH); 

當我做到這一點,確實發現這樣的:

/blob/sqlserver/Refinance-Other/FRM/660-700/4.00-4.50/properties-4.00-4.50.csv 

但我只在uniqueid中獲得「Refinance-Other」作爲變量。

然而,編碼的斜線仍不能正常工作,這似乎很奇怪?爲什麼它會爲上述非編碼的URI與MODE_STARTS_WITH工作,不是這個URI?:

/blob/sqlserver/Refinance-Other%2FFRM%2F660-700%2F4.00-4.50%2Fproperties-4.00-4.50.csv 

回答

0

我對你的使用情況和我做了一些測試,爲Restlet版本2.3.4工作。你使用了哪個版本?

這裏是我使用的代碼:

  • 應用

    public class RestletApplication extends Application { 
        @Override 
        public Restlet createInboundRoot() { 
         Router router = new Router(getContext()); 
         router.attach("/blob/sqlserver/{uniqueid}", TestServerResource.class); 
         return router; 
        } 
    } 
    
  • 服務器資源

    public class TestServerResource extends ServerResource { 
        @Get 
        public String test() { 
         String attr = getAttribute("uniqueid"); 
         System.out.println("attr = "+attr); 
         return "ok"; 
        } 
    } 
    
  • 客戶

    public class TestClient { 
        public static void main(String[] args) { 
         try { 
          // Encoded path variable 
          ClientResource cr1 = new ClientResource(
           "http://localhost:8182/blob/sqlserver/Refinance-Other%2FFRM%2F660-700%2F4.00-4.50%2Fproperties-4.00-4.50.csv"); 
          Representation repr1 = cr1.get(); 
          System.out.println(repr1.getText()); 
    
          // Non encoded path variable 
          ClientResource cr2 = new ClientResource(
           "http://localhost:8182/blob/sqlserver/Refinance-Other/FRM/660-700/4.00-4.50/properties-4.00-4.50.csv"); 
          Representation repr2 = cr2.get(); 
          System.out.println(repr2.getText()); 
         } catch(Exception ex) { 
          ex.printStackTrace(); 
         } 
        } 
    } 
    

對於第一個請求,得到了一個200個狀態碼和uniqueid路徑變量的值是Refinance-Other%2FFRM%2F660-700%2F4.00-4.50%2Fproperties-4.00-4.50.csv

對於第二個,我得到一個404狀態碼,這是正常的,因爲在Restlet中沒有配置匹配的路由。

希望它能幫到你, Thierry