org.restlet.routing.Router似乎不接受编码的斜杠

时间:2016-01-06 03:37:38

标签: java encoding restlet

我正在使用Restlet并且遇到路由器模板的问题,该模板的模板中的变量包含编码斜杠。以下是详细信息:

当我使用这条路线时:

/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下的变量。

然而,编码的斜杠仍然不起作用,这看起来很奇怪?为什么它适用于上面带有MODE_STARTS_WITH的非编码URI而不是这个URI?:

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

2 个答案:

答案 0 :(得分:0)

实际上,在它到达我之前,URL编码正在被解码,这两个帖子帮我解决了这个问题。作为证明,双重编码有效:

Is a slash ("/") equivalent to an encoded slash ("%2F") in the path portion of an HTTP URL

ALLOW_ENCODED_SLASH on AWS Elasticbeanstalk

并查看对此票证的第一个回复:

https://issues.jboss.org/browse/JBSEAM-3990

答案 1 :(得分: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中没有配置匹配的路由。

希望它可以帮到你, 亨利