我有2个Spring Web应用程序:Application1和Application2.在Application1中,我在" http:// application1/getbigcsv "中有一个端点,它使用流式传输,以便在用户点击该URL时向用户提供巨大的150MB CSV文件.
我不希望用户直接点击Application1,而是点击Application2.如果我在Application2的控制器中有以下方法
@RequestMapping(value = "/large.csv", method = GET, produces = "text/csv")
@ResponseStatus(value = HttpStatus.OK)
public String streamLargeCSV() {
// Make an HTTP Request to http://application1/getbigcsv
// Return its response
}
Run Code Online (Sandbox Code Playgroud)
我担心的是上面没有做"流",而Application1正在做流式传输.有没有什么方法可以确保application2将以流方式从application1的rest端点返回相同的数据?或者上面的方法实际上已经在"Streaming"方法中返回了东西,因为Application1正在将其端点作为流服务器提供服务?
Mic*_*l-O 14
首先:您可以但不能使用该方法签名.
遗憾的是,您还没有展示如何在app1中生成CSV文件,无论这是真正的流式传输.我们假设它是.
您的签名将如下所示:
@RequestMapping(value = "/large.csv", method = GET, produces = "text/csv")
@ResponseStatus(value = HttpStatus.OK)
public void streamLargeCSV(OutputStream out) {
// Make an HTTP Request to http://application1/getbigcsv
// Return its response
}
Run Code Online (Sandbox Code Playgroud)
现在我们必须首先从app1获取输入流.使用Apache HttpClient 获取您的HttpEntity.该实体有一个writeTo(OutputStream)接收out参数的方法.它将阻塞,直到所有字节都被消耗/流式传输.完成后,释放所有HttpClient资源.
完整代码:
@RequestMapping(value = "/large.csv", method = GET, produces = "text/csv")
@ResponseStatus(value = HttpStatus.OK)
public void streamLargeCSV(OutputStream out) {
// Make an HTTP Request to http://application1/getbigcsv
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://application1/getbigcsv");
CloseableHttpResponse response = httpclient.execute(httpGet);
try {
HttpEntity entity = response.getEntity();
// Return its response
entity.writeTo(out);
} finally {
response.close();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的真实世界的例子.开始阅读"有兴趣说出我所取得的成就特别是:"
| 归档时间: |
|
| 查看次数: |
8163 次 |
| 最近记录: |