使用Restlet 2.1 for Java EE,我发现了一个处理属性的有趣问题。
假设您有以下代码:
cmp.getDefaultHost().attach("/testpath/{attr}",SomeServerResource.class);
并在浏览器中提供以下网址:
http://localhost:8100/testpath/command
然后,当然,attr属性设置为“command”。
不幸的是,假设您希望该属性类似于命令/测试,如以下URL:
http://localhost:8100/testpath/command/test
或者如果您想动态添加不同级别的内容,例如:
http://localhost:800/testpath/command/test/subsystems/network/security
在这两种情况下,attr属性仍然设置为“command”!
在重定向应用程序中是否有某种方法可以创建一个可以保留“斜杠”的属性,例如,可以将attr属性设置为“command / test”?我希望能够在testpath之后抓取所有内容并将整个字符串作为属性。
这可能吗?有人请指教。
答案 0 :(得分: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 param的字符串,wrap返回StringRepresentation。
现在,如果我这样做:
http://127.0.0.1/test/haha/awesome
我得到了404。
相反,我这样做:
http://127.0.0.1/test/haha%2fawesome
我有URLEncoded文件夹路径。这导致我的浏览器说:
haha%2fawesome haha/awesome
第一个是原始字符串,第二个是结果。我不知道这是否适合您的需求,因为它只是一个简单的例子,但只要您对属性进行URLEncode,就可以在另一端解码它。
答案 1 :(得分:1)
对于同样的情况,我通常会更改变量的类型:
Route route = cmp.getDefaultHost().attach("/testpath/{attr}",SomeServerResource.class);
route.getTemplate().getVariables().get("attr") = new Variable(Variable.TYPE_URI_PATH);