Restlet - 重定向到资源

Restlet - redirecting to a resource

我正在尝试将 /boxes/{id} 重定向到 /boxes/{id}/description (Restlet 2.3.7):

Redirector redirector = new Redirector(getContext(),
        "/boxes/{id}/description",
        Redirector.MODE_CLIENT_SEE_OTHER);
router.attach("/boxes/{id}", redirector);

这似乎有效,除非部署到 non-root URL 路径下的 Servlet 容器。在这种情况下,Location header 中省略了基本路径,因此重定向不起作用。

这本书 "Restlet in Action," 展示了使用绝对 URI 的重定向器。我知道 HTTP/1.1 不允许重定向到路径,但 Restlet 确实在位置 header 中为我创建了 URI 的其余部分,Servlet 根路径部分除外。

我找到了 this old mailing list posting,但似乎必须有更好的方法。

我通过创建一个新资源来处理重定向解决了这个问题:

public class BoxesResource extends ServerResource {

    public static class RedirectingResource extends ServerResource {
        @Get
        public Representation doGet() {
            final String id = (String) this.getRequest().
                    getAttributes().get("id");
            final Reference newRef = new Reference(
                    getRootRef().toString() + "/boxes/" + id + "/description");
            redirectSeeOther(newRef);
            return new EmptyRepresentation();
        }
    }

    @Get
    public Representation doGet() {
        // ...
    }

}

然后我将其附加到我的应用程序中 createInboundRoot():

router.attach("/boxes/{id}", BoxesResource.RedirectingResource.class);
router.attach("/boxes/{id}/description", BoxesResource.class);