一个有趣的Restlet属性行为

时间:2012-12-05 20:13:42

标签: restlet restlet-2.0

使用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之后抓取所有内容并将整个字符串作为属性。

这可能吗?有人请指教。

2 个答案:

答案 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);
相关问题