Скачать файл с Micronaut - PullRequest
3 голосов
/ 19 июня 2020

Мой клиент должен получить файл от контроллера. Не знаю, как реализовать Клиента. Это мой Контроллер:

@Get("/{databaseName}")
MutableHttpResponse < Object > createDatabaseBackup(String databaseName) {
    InputStream inputStreamDatabaseBackup = backupTask.exportBackup(databaseName);
    return HttpResponse.ok(new StreamedFile(inputStreamDatabaseBackup, MediaType.APPLICATION_OCTET_STREAM_TYPE));
}

Вот мой клиент, проблема в том, что Клиент получает только строку. Как я могу теперь получить возвращенный поток от контроллера?

Клиент:

@Inject
@Client("${agent.connection-url}")
private RxHttpClient client;

public String getBackup(String dataBaseName) {
    return client.toBlocking().retrieve(HttpRequest.GET("/backup/" + dataBaseName));
}

1 Ответ

3 голосов
/ 19 июня 2020

Вы должны определить, что вам нужен ответ как массив byte[]:

public byte[] getBackup(String databaseName) {
    return client.toBlocking().retrieve(HttpRequest.GET("/backup/" + databaseName), byte[].class);
}

Затем вы можете преобразовать массив byte в любой поток, который хотите.

Или вы можете используйте реактивный способ:

public Single<byte[]> getBackup(String databaseName) {
    return client.retrieve(HttpRequest.GET("/backup/" + databaseName), byte[].class)
        .collect(ByteArrayOutputStream::new, ByteArrayOutputStream::writeBytes)
        .map(ByteArrayOutputStream::toByteArray);
}

Или вы можете определить декларативный клиент:

@Client("${agent.connection-url}")
public interface SomeControllerClient {

    @Get(value = "/{databaseName}", processes = MediaType.APPLICATION_OCTET_STREAM)
    Flowable<byte[]> getBackup(String databaseName);

}

И затем использовать его там, где вам нужно:

@Inject
SomeControllerClient client;

public void someMethod() {
    client.getBackup("some-database")
        .collect(ByteArrayOutputStream::new, ByteArrayOutputStream::writeBytes)
        .map(ByteArrayOutputStream::toByteArray)
        .otherStreamProcessing...
}
...