我正在开发一个接受和过滤json数据流的Web服务。为了测试我的代码,我正在从一个文件中读取json,但是当文件超过2.5MB时,RestTemplate连接会超时。我想知道为什么这不起作用,如果有更好的方法可以做到这一点
String requestUrl = "http://localhost:" + port + "/v1/filterLarge";
InputStream is = getClass().getClassLoader().getResourceAsStream("data.json");
RequestCallback requestCallback = (ClientHttpRequest request) -> {
request.getHeaders().setContentType(MediaType.APPLICATION_OCTET_STREAM);
IOUtils.copy(is, request.getBody());
};
ResponseExtractor<Void> responseExtractor = (ClientHttpResponse clientHttpResponse) -> {
InputStream inputStream = clientHttpResponse.getBody();
try (FileOutputStream os = new FileOutputStream(new File("C:\\Development\\bags.json"))) {
IOUtils.copy(inputStream, os);
}
return null;
};
final RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);
restTemplate.execute(requestUrl, HttpMethod.POST, requestCallback, responseExtractor);
这是我的服务器端代码:
@PostMapping(value="/filterLarge")
public ResponseEntity<StreamingResponseBody> filterLarge(HttpServletRequest request) throws IOException {
StreamFilter streamFilter = new StreamFilter();
InputStream is = request.getInputStream();
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).cacheControl(CacheControl.noCache()).body(
(OutputStream outputStream) ->
streamFilter.filter(is, outputStream)
);
}
答案 0 :(得分:0)
您已经说过要上传文件,但实际上您只是直接在请求正文中发送文件内容。因此,您需要更改客户端代码以实际执行文件上载(即多部分请求)。您可以在多个SO答案中找到示例实现,例如here。您需要这样做,因为出于安全原因,不建议使用大型POST请求主体。
现在,完成上述操作后,请更改以下属性(reference)以增加默认的可接受限制。
spring.servlet.multipart.max-file-size=<Size>
spring.servlet.multipart.max-request-size=<Size>
或者,如果您仍希望不更改客户端实现,请根据您使用的服务器(boot中的默认值为tomcat)更改以下属性以增加POST限制。 tomcat的默认大小为2 MB。
server.<Server>.max-http-post-size=<Size-In-Bytes>
<Server>
可以是“tomcat”或“jetty”或者您使用的任何内容。