5

我的客户应该收到来自控制器的文件。问题是客户端只接收一个字符串。如何从 Controller 获取返回的流?

这是我的控制器:

@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));
}
4

1 回答 1

6

您必须将需要响应定义为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...
}
于 2020-06-19T14:12:26.870 回答