2011-06-22 37 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); 
    // ... 
}