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);
我正在尝试将 /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);