0

使用 Java EE 的 Restlet 2.1,我发现了一个有趣的问题,即它处理属性的能力。

假设您有如下代码:

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

并在您的浏览器上提供以下 URL:

http://localhost:8100/testpath/command

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

不幸的是,假设您希望属性类似于命令/测试,如以下 URL:

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

或者,如果您想动态添加不同级别的内容,例如:

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

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

在restlet应用程序中是否有某种方法可以制作一个可以保留“斜线”的属性,例如,可以将attr属性设置为“command/test”?我希望能够在 testpath 之后抓取所有内容并将整个字符串作为属性。

这可能吗?有人请指教。

4

2 回答 2

1

您可以通过使用 url 编码来做到这一点。

我在路由器中添加了以下附件:

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参数的字符串,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,就可以在另一端对其进行解码。

于 2012-12-06T19:31:04.540 回答
1

对于同样的情况,我通常会更改变量的类型:

Route route = cmp.getDefaultHost().attach("/testpath/{attr}",SomeServerResource.class);
route.getTemplate().getVariables().get("attr") = new Variable(Variable.TYPE_URI_PATH);
于 2012-12-18T00:42:23.117 回答