我需要创建一个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.如何将回调网址传递给客户端?
答案 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);
// ...
}