如何聚合来自多个服务的JAX-RS响应

时间:2013-03-05 07:53:07

标签: java rest jax-rs resteasy

我们有一个登录后显示的用户仪表板。仪表板由多个小部件组成。 每个小部件都从单独的restful服务中提取内容。 例如:/ news / mails / questions / alerts。 每个小部件在页面上加载后调用该服务。这种方式有多个webservice调用。

有没有办法减少多次通话。

它应该工作的方式是在第一次加载页面时服务应该返回单个调用中所有小部件的聚合数据。

每个服务也应该是独立可用的,以便它可以用于刷新单个小部件,以及用于其他系统集成。

注意:这种情况下的小部件是任何可以从restful服务中消耗json数据的javascript portlet。 所有服务都在一个Web应用程序中。

我们如何汇总来自多个服务的响应并合并为一个JSON?

2 个答案:

答案 0 :(得分:1)

如果您可以添加自己的JAX-RS服务,只需添加一个新服务,调用其他每个服务并创建聚合响应。

例如:

GET http://myservice.com/rest/aggregate?service=news&service=mails&service=questions

serivce的url前缀可以作为单独的编码参数提供,也可以在聚合服务中提供。

如果所有这些都在同一服务器中运行,则只需使用其他服务的现有API来创建聚合响应。

答案 1 :(得分:0)

请记住,json服务只是方法,所以要详细说明@ Vengard的答案(请接受之前的那个)你可以(创建一个看起来像这样的聚合方法:

@Path ("15218462")
class Test {
  @Path ("aggregate")
  public Map<String, Object> aggregate(@QueryParam("service") List<String> services) {
    Map<String, Object> result = new HashMap<>();       
      for (String serviceName : services) {
        if(serviceName.equals("mails") {
          result.put("mails", mails());
        }
        // ... etc 
      }
  }
  @Path
  public List<String> mails() {
    // .... processing code ...
  }
}

如果服务不在您的控制范围内且您不介意依赖第三方,您可能需要查看Yahoo管道(http://pipes.yahoo.com/pipes/

等内容。