Mam następujące zasoby Rest, które pobierają plik z bazy danych. Działa dobrze z przeglądarki, jednak gdy próbuję zrobić to z klienta Java, jak poniżej, otrzymuję 406 (błąd niedozwolony).Jak programowo spożywać plik z interfejsu API odpoczynku przy użyciu Spring?
...
@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);
}
...
Klient jest zainstalowany na tym samym serwerze z innego portu (komunikat daje poprawną nazwę):
...
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());
...
Co ja tu brakuje?
czy te pliki mogą być duże? Sugerowałbym przesyłanie strumieniowe zamiast ładowania wszystkich bajtów do tablicy i wysłania jej z powrotem. –
@ TritonMan Rozmiar pliku wynosi około 90 KB, więc nie jest zbyt duży. – Sami
Nie jestem pewien, czy to jest pomocne, czy nie, ale mój zespół właśnie zaczął korzystać z modernizacji naszych połączeń z resztą. Zasadniczo definiujesz interfejs z przypisami, wtedy możesz wykonywać połączenia spoczynkowe, tak jak wywołujesz inną metodę. Retrofit obsługuje wszystkie szczegóły w tle: http://square.github.io/retrofit/ – StormeHawke