读取返回StreamingResponseBody作为响应的API

时间:2019-05-30 23:31:08

标签: java ios angularjs spring-boot streaming

我有一个API,该API以JSON格式返回大量数据(> 7 MB)。 IOS设备正在访问此API并将数据存储到本地设备存储中。由于响应量很大,因此用户会遇到很长的延迟。

我用相同的数据创建了另一个API,但是这次我使用StreamingResponseBody将输出作为流直接写到响应对象。现在,响应大小减小到2 MB。但是客户端设备(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 :(得分:0)

您将返回字节流,邮递员将其打印为字节(不可读)。您需要先保存流,然后将其读取为普通文件(即下载文件并使用IOS / Angular打开它)。