Чтение API, который возвращает StreamingResponseBody в ответ - PullRequest
0 голосов
/ 31 мая 2019

У меня есть API, который возвращает огромные данные (> 7 МБ) в формате JSON. Устройство IOS обращается к этому API и хранит данные в локальном хранилище устройства. Поскольку размер ответа огромен, пользователь испытывает длительную задержку.

Я создал другой API с теми же данными, но на этот раз я использовал StreamingResponseBody, чтобы записать вывод непосредственно в объект ответа в виде потока. Теперь размер ответа уменьшен до 2 МБ. Но как клиентское устройство (IOS / Angular) может прочитать ответ? Потому что, когда я нажимаю на API от почтальона, вывод не читается.

Вот код контроллера -

@GetMapping( value = "/materials/stream")
    public ResponseEntity<StreamingResponseBody> getMaterialsStreamed() {

        StreamingResponseBody responseBody = outputStream -> {
            try (ObjectOutputStream oos = new ObjectOutputStream(outputStream)) {
                oos.writeObject(service.getMaterials()); // service.getMaterials() is returning Iterable<Material>
            }
        };

        return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=generic_file_name.json")
                .contentType(MediaType.APPLICATION_OCTET_STREAM).body(responseBody);
    }

1 Ответ

0 голосов
/ 31 мая 2019

вы возвращаете поток байтов, почтальон просто распечатает его как байты (что не читается). сначала нужно сохранить поток, а затем прочитать его как обычный файл (т.е. загрузить файл и открыть его с помощью IOS / Angular).

...