![](/img/trans.png)
[英]how can I consume rest api of one module from other module in same application using spring boot application without module dependency
[英]How to programmatically consume a file from a Rest API using Spring?
我有以下Rest资源从DB下载文件。 它可以在浏览器中正常工作,但是,当我尝试从Java客户端执行此操作时,我得到406(不接受错误)。
...
@RequestMapping(value="/download/{name}", method=RequestMethod.GET,
produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public @ResponseBody HttpEntity<byte[]> downloadActivityJar(@PathVariable String name) throws IOException
{
logger.info("downloading : " + name + " ... ");
byte[] file = IOUtils.toByteArray(artifactRepository.downloadJar(name));
HttpHeaders header = new HttpHeaders();
header.set("Content-Disposition", "attachment; filename="+ name + ".jar");
header.setContentLength(file.length);
return new HttpEntity<byte[]>(file, header);
}
...
客户端部署在具有不同端口的同一服务器上(消息提供正确的名称):
...
RestTemplate restTemplate = new RestTemplate();
String url = "http://localhost:8080/activities/download/" + message.getActivity().getName();
File jar = restTemplate.getForObject(url, File.class);
logger.info("File size: " + jar.length() + " Name: " + jar.getName());
...
我在这里错过了什么?
响应代码为406 Not Accepted。 您需要指定一个'Accept'请求标头,该标头必须与RequestMapping的'produce'字段匹配。
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter());
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM));
HttpEntity<String> entity = new HttpEntity<String>(headers);
ResponseEntity<byte[]> response = restTemplate.exchange(URI, HttpMethod.GET, entity, byte[].class, "1");
if(response.getStatusCode().equals(HttpStatus.OK))
{
FileOutputStream output = new FileOutputStream(new File("filename.jar"));
IOUtils.write(response.getBody(), output);
}
一个小警告:不要对大文件执行此操作。 RestTemplate.exchange(...)总是将整个响应加载到内存中,因此您可以获得OutOfMemory异常。 为避免这种情况,请不要使用Spring RestTemplate,而是直接使用Java标准HttpUrlConnection或apache http-components。
也许试试这个,改变你的休息方法:
public javax.ws.rs.core.Response downloadActivityJar(@PathVariable String name) throws IOException {
byte[] file = IOUtils.toByteArray(artifactRepository.downloadJar(name));
return Response.status(200).entity(file).header("Content-Disposition", "attachment; filename=\"" + name + ".jar\"").build();
}
此外,使用这样的东西下载文件,你做错了。
org.apache.commons.io.FileUtils.copyURLToFile(new URL("http://localhost:8080/activities/download/" + message.getActivity().getName()), new File("locationOfFile.jar"));
你需要告诉它保存文件的位置,REST API不会为你做那个我不认为的。
您可以将InputStreamResource与ByteArrayInputStream一起使用。
@RestController
public class SomeController {
public ResponseEntity<InputStreamResource> someResource() {
byte[] byteArr = ...;
return ResponseEntity.status(HttpStatus.OK).body(new InputStreamResource(new ByteArrayInputStream(byteArr)));
}
}
使用此选项可以使用交换下载JPEG图像。 这很完美。
URI uri = new URI(packing_url.trim());
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.IMAGE_JPEG));
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
// Send the request as GET
ResponseEntity<byte[]> result= template.exchange(uri, HttpMethod.GET, entity, byte[].class);
out.write(result.getBody());
尝试使用RestTemplate上的execute方法和ResponseExtractor,并使用提取器从流中读取数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.