From 2d4cda56ca9522a11008cfb264dad6c71ec6b42d Mon Sep 17 00:00:00 2001 From: Sashir Estela Date: Fri, 24 Jan 2025 04:20:16 +0000 Subject: [PATCH] Handle OkHttp read binary result --- .../example/FileDownloadExample.java | 10 ++++++---- .../client/OkHttpClientAdapter.java | 8 ++++---- src/test/resources/download.png | Bin 1130 -> 13444 bytes 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/example/java/io/github/sashirestela/cleverclient/example/FileDownloadExample.java b/src/example/java/io/github/sashirestela/cleverclient/example/FileDownloadExample.java index 0b6568b..7c3ba09 100644 --- a/src/example/java/io/github/sashirestela/cleverclient/example/FileDownloadExample.java +++ b/src/example/java/io/github/sashirestela/cleverclient/example/FileDownloadExample.java @@ -3,6 +3,7 @@ import io.github.sashirestela.cleverclient.CleverClient; import io.github.sashirestela.cleverclient.annotation.GET; import io.github.sashirestela.cleverclient.annotation.Path; +import io.github.sashirestela.cleverclient.annotation.Resource; import java.io.FileOutputStream; import java.io.IOException; @@ -20,21 +21,22 @@ public FileDownloadExample() { public void run() throws IOException { var cleverClient = CleverClient.builder() - .baseUrl("https://via.placeholder.com") + .baseUrl("https://en.wikipedia.org") .clientAdapter(clientAdapter) .build(); var imageService = cleverClient.create(ImageService.class); - var binaryData = imageService.getImage("92c952"); + var binaryData = imageService.getImage("wikipedia.png"); var file = new FileOutputStream("src/test/resources/download.png"); file.write(binaryData.readAllBytes()); file.close(); } + @Resource("/static/images/icons") static interface ImageService { - @GET("/150/{id}") - InputStream getImage(@Path("id") String id); + @GET("/{name}") + InputStream getImage(@Path("name") String name); } diff --git a/src/main/java/io/github/sashirestela/cleverclient/client/OkHttpClientAdapter.java b/src/main/java/io/github/sashirestela/cleverclient/client/OkHttpClientAdapter.java index 1642085..e04d09f 100644 --- a/src/main/java/io/github/sashirestela/cleverclient/client/OkHttpClientAdapter.java +++ b/src/main/java/io/github/sashirestela/cleverclient/client/OkHttpClientAdapter.java @@ -59,7 +59,7 @@ protected Object send(RequestData request) { try { var response = okHttpClient.newCall(okHttpRequest).execute(); logger.debug(RESPONSE_CODE_FORMAT, response.code()); - if (returnType.isStream()) { + if (returnType.isStream() || returnType.isInputStream()) { var responseContent = getResponseContent(response.body(), returnType); var originalResponseData = convertToResponseData(response, responseContent); throwExceptionIfErrorIsPresent(originalResponseData); @@ -96,7 +96,7 @@ public void onFailure(Call call, IOException e) { @Override public void onResponse(Call call, Response response) throws IOException { logger.debug(RESPONSE_CODE_FORMAT, response.code()); - if (returnType.isStream()) { + if (returnType.isStream() || returnType.isInputStream()) { try { var responseContent = getResponseContent(response.body(), returnType); var originalResponseData = convertToResponseData(response, responseContent); @@ -262,7 +262,7 @@ public FunctionsByCategory(BiFunction responseConver private void fillFunctionsByCategory() { this.functionsByCategoryMap = new EnumMap<>(Category.class); functionsByCategoryMap.put(Category.SYNC_BINARY, new FunctionsByCategory( - (r, t) -> r)); + (r, t) -> ((ResponseData) r).getBody())); functionsByCategoryMap.put(Category.SYNC_PLAIN_TEXT, new FunctionsByCategory( (r, t) -> r)); functionsByCategoryMap.put(Category.SYNC_CUSTOM, new FunctionsByCategory( @@ -276,7 +276,7 @@ private void fillFunctionsByCategory() { functionsByCategoryMap.put(Category.SYNC_STREAM_EVENT, new FunctionsByCategory( (r, t) -> convertToStreamOfEvents((ResponseData) r, t))); functionsByCategoryMap.put(Category.ASYNC_BINARY, new FunctionsByCategory( - (r, t) -> r)); + (r, t) -> ((ResponseData) r).getBody())); functionsByCategoryMap.put(Category.ASYNC_PLAIN_TEXT, new FunctionsByCategory( (r, t) -> r)); functionsByCategoryMap.put(Category.ASYNC_CUSTOM, new FunctionsByCategory( diff --git a/src/test/resources/download.png b/src/test/resources/download.png index 73bcf8c8b92467879608c1a3b067a73bda77ae7a..4dd204669df5325cb2bbec6a0a987e1683cf437f 100644 GIT binary patch literal 13444 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 TPw1)!mLUwDu6{1-oD!M