如何使用Jersey和Dropwizard重定向用户并将消息传递到目标页面?

3
我有一个POJO资源,定义了一些HTTP端点并返回Dropwizard视图。这些端点中的一些仅执行操作(例如更新数据库),然后将用户转到另一个端点。例如,用户位于位置GET /foo ,并提交表单。这将引导他们到端点POST /foo/submit,处理他们的提交,然后将其转发到GET /foo/done。例如,如果他们刷新页面,则可以防止重新提交表单。这种转发目前是使用Jersey的Response.seeOther()方法实现的(返回Response而不是View)。
我希望能够在处理方法处理他们的提交时生成某种消息(错误消息、警告、成功等),并将该消息传递给我们要转发到的页面。例如,在 GET /foo/done 处,我希望在页面顶部显示“提交完成!”或“提交失败,因为...”。
我已经搜索过很多人建议抛出WebApplicationException-但并非所有情况都是错误。有时我只想显示成功操作的确认。但是我无法弄清楚接收方法如何接收消息。我之前用Python做过这件事,通过让处理方法接受一个可选字典来实现,但不幸的是我使用的是Java 7,所以无法给方法传递带有默认值的可选参数。
感谢您的帮助。
1个回答

2

重定向将简单地发送GET请求。GET请求不应该有任何正文内容。要使用GET请求发送任意数据,只需将其发送到查询字符串中(当然,这里不应该有任何机密信息)。例如:

@Path("foo")
public class FooResource {

    @GET
    @Path("done")
    public String getDone(@QueryParam("message") String message) {
        return message;
    }

    @POST
    @Path("submit")
    public Response postData() {
        String message = UriComponent.encode(
                "You have perefected submitting!", 
                UriComponent.Type.QUERY_PARAM_SPACE_ENCODED);
        return Response.seeOther(URI.create("/api/foo/done?message=" + message)).build();
    }
}

谢谢你的帮助!虽然不是理想的解决方案,但它能够工作。如果我可以传递一个对用户隐藏的对象(例如不在URL字符串中),那就更好了。这完全不可能吗? - tytk
据我所知没有这样的功能。为了使代码更加简洁,您可以发送一些对外部世界没有意义但在接收端被映射到某个值的数字。 - Paul Samsotha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接