2012-12-05 27 views
0

对于Java EE使用Restlet 2.1,我发现了一个处理属性的有趣问题。一个有趣的Restlet属性行为

假设你有一个像下面的代码:

cmp.getDefaultHost().attach("/testpath/{attr}",SomeServerResource.class); 

,并在您的浏览器,您提供以下网址:

http://localhost:8100/testpath/command 

然后,当然ATTR属性被设置为“命令” 。

不幸的是,假设你想要的属性是这样的命令/测试,如下面的网址:

http://localhost:8100/testpath/command/test 

,或者如果你想动态添加的东西有不同的层次,如:

http://localhost:800/testpath/command/test/subsystems/network/security 

在这两种情况下,attr属性仍然设置为“command”!

是否有一个的Restlet应用程序的一些方法,使可以保留“斜线”的属性,这样一方面可以,例如,使ATTR属性设置为“命令/测试”?我希望能够在testpath之后抓住所有东西,并将整个字符串作为属性。

这可能吗?有人请指教。

回答

1

对于相同的情况下,我通常会改变所述可变的类型:

Route route = cmp.getDefaultHost().attach("/testpath/{attr}",SomeServerResource.class); 
route.getTemplate().getVariables().get("attr") = new Variable(Variable.TYPE_URI_PATH); 
+0

虽然这两种解决方案都有效,但我更喜欢你的解决方案,因为在用户可能需要输入URL的情况下,我不愿意使用前者。虽然这两种解决方案都很好。 –

1

您可以使用网址编码来完成此操作。

我改变了我的路由器以下附件:

router.attach("/test/{cmd}", TestResource.class); 

我的测试资源类看起来是这样的,从Apache Commons Codec URLCodec

@Override 
protected Representation get() { 
    try { 
    String raw = ResourceWrapper.get(this, "cmd"); 
    String decoded = new String(URLCodec.decodeUrl(raw.getBytes())); 
    return ResourceWrapper.wrap(raw + " " + decoded); 
    } catch(Exception e) { throw new RuntimeException(e); } 
} 

的帮助不大注意我的资源包装类是简单实用方法。 get返回url参数的字符串,并且包装返回一个StringRepresentation。

现在,如果我做这样的事情:

http://127.0.0.1/test/haha/awesome 

,我收到了404

相反,我这样做:

http://127.0.0.1/test/haha%2fawesome 

我已经url编码的文件夹路径。这导致我的浏览器说:

haha%2fawesome haha/awesome 

第一个是原始字符串,第二个是结果。我不知道这是否适合您的需要,因为它是一个简单的例子,但只要你用urlencode你的属性,你可以在另一端进行解码。

+0

感谢。对于客户端应用程序正在生成URL的情况,这是一个很好的解决方案... –

+0

我认为用户进入自己的url命令的想法是个人不好的主意。但是如果你解决了问题,那太棒了! – corsiKa