【问题标题】:Async REST calls with JAX-RS使用 JAX-RS 的异步 REST 调用
【发布时间】:2011-06-22 13:12:17
【问题描述】:

我需要创建一个 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. 如何将回调url传给客户端?

【问题讨论】:

  • 你使用的是什么 JAX-RS 实现?

标签: rest asynchronous jax-rs


【解决方案1】:

让 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

【讨论】:

  • 不,它没有返回响应对象?我可以让它返回 202 而不显式返回 Response 吗?
  • 为什么不想显式返回一个响应?
  • 我有一些方法注释 @Produces 返回域模型对象,这些对象自动编组为必要的类型。所以我只是不想用响应来包装它们。其他原因是在集成测试中我使用代理类,我只收到普通的域对象,而不是响应包装的东西。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    相关资源
    最近更新 更多