使用JAX-RS调用异步REST

时间:2011-06-22 13:12:18

标签: rest asynchronous jax-rs

我需要创建一个RESTful服务,它应该以下面的方式支持异步调用。当用户调用某个方法时,他获得了http'202'代码和url来查询他可以看到他的请求状态的位置。目前我使用JAX-RS及其年份:

@Path("")
public interface MyService {

    @POST
    @Path("/myService/{name}")
    @Consumes({APPLICATION_XML, APPLICATION_JSON})
    void postSomething(@PathParam("name") String name, MyObject data);

}

这样的映射会通过url / myService / {name}公开MyService的postSomething()方法,它提供POST请求,从url获取'name'参数,从请求体获取'data'。

我希望在做出这个PUT请求后,客户端获得202个http代码和一些回调url进行轮询,以便在执行方法后得到结果。

所以问题是: 1.如何让JAX-RS返回202代码? 2.如何将回调网址传递给客户端?

2 个答案:

答案 0 :(得分:2)

让postSomething方法返回一个Response对象:

public Response postSomething(@PathParam("name") String name, MyObject data) {
   return Response.status(Status.ACCEPTED).build();
}

如果您希望HTTP Body中的回调URI为纯文本,您可以执行以下操作:

public Response postSomething(@PathParam("name") String name, MyObject data) {
   return Response.status(Status.ACCEPTED).entity("http://google.com").build();
}

要按资源类生成URI,请查看UriBuilder

答案 1 :(得分:0)

使用@Context HttpServletResponse servletResponse直接控制servlet的响应机制。

@PUT
@Path("/myService/{name}")
@Consumes({APPLICATION_XML, APPLICATION_JSON})
void postSomething(@PathParam("name") String name, @Context HttpServletResponse response, MyObject data) {
    // ...
    response.setStatus(HttpServletResponse.SC_ACCEPTED);
    response.setHeader("Location", myURL);
    // ...
}