如何将大型响应数据从Java rest Web服务传递到客户端?

时间:2017-09-01 19:01:02

标签: java json rest jersey

我正在创建一个Java Rest Web服务,它以JSON格式提供大型报告。这可以大到几百万行。实现Web服务的最佳方式是什么,它将有效地将这些大数据作为响应发送给客户端。因为我无法在内存中将记录集转换为JSON,因为它会在GC上创建负载。

2 个答案:

答案 0 :(得分:1)

这完全取决于上下文:)

如果您将数据作为JSON提供(并假设您是“jersey”标签),我建议将您的对象(报告行)包装到实现分页功能的结构中。

{
    "current-page" : (num),
    "max-pages" : (numOfAllPages),
    "rows" : [{
       {(row1)},    {(row2)},   {(row...n)},
   }]
}

并且您的REST处理程序接受QueryString参数,如:?page =(num)

除非,您需要一次发送所有行。如果您这样做 - 我建议您直接写入响应流,为用户设置正确的响应标头以触发“下载”操作。

答案 1 :(得分:1)

解决方案很少 首先是Miron指出的Paginate。

第二个Chunky输出 你使用ChunkyOutput课程发送它。在此,您的客户还需要使用ChunkyInput

@Path("/chunkyresource")
public class ResourceSentAsChunks {
    @GET
    public ChunkedOutput<String> chunkedGet() {
        System.out.println("ResourceSentAsChunks.chunkedGet()");
        final ChunkedOutput<String> output = new ChunkedOutput<String>(String.class);

        new Thread() {
            @Override
            public void run() {
                try {
                    for (int i = 0; i < 100000; i++) {
                        output.write(i + " ");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        output.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
        return output;
    }

如果您可以将回复作为附件发送,或者您拥有自己的客户端应用程序,则第三次使用压缩。这种技术在图像的情况下使用相当广泛。