2011-06-22 27 views
3

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

@Path("") 
public interface MyService { 

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

} 

这种映射将暴露的MyService的postSomething()的URL /为myService/{name}的方法,该方法提供POST请求,从URL获得 '名' 参数和 '数据'来自请求主体。

我想让这个PUT请求客户端得到202 http代码和一些回调URL轮询以获得结果一旦方法将被执行。

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

+0

您使用的是JAX-RS的实现? – jfocht

回答

2

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

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

如果你想在回调URI作为HTTP主体纯文本,你可以做这样的事情:

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

为了生成资源类的URI,看看UriBuilder

+0

不,它没有返回响应对象?我能否在没有明确回复的情况下返回202? – Vladimir

+0

为什么你不想显式返回一个响应? – jfocht

+1

我有一些方法注释@Produces返回自动编组为必要类型的域模型对象。所以我只是不想用Response对它们进行烫印。其他原因是在集成测试中,我使用的是代理类,而我只是收到了正常的域对象,而不是响应中包装的东西。 – Vladimir

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); 
    // ... 
}