From c357202e5395dc679808d7bbd68a99e94465c40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AD=E5=A6=82?= <8775@163.com> Date: Wed, 11 Jun 2025 21:53:53 +0800 Subject: [PATCH] =?UTF-8?q?java-sdk=E6=B7=BB=E5=8A=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.md | 1 + sop-sdk/sdk-java/pom.xml | 5 ++ .../com/gitee/sop/sdk/client/OpenClient.java | 52 +++++++++++++-- .../com/gitee/sop/sdk/client/OpenHttp.java | 65 +++++++++++++++++-- .../com/gitee/sop/sdk/client/OpenRequest.java | 24 +++++++ .../com/gitee/sop/sdk/common/FileResult.java | 17 +++++ .../gitee/sop/sdk/request/BaseRequest.java | 6 +- .../gitee/sop/sdk/request/DownloadAware.java | 7 ++ .../sop/sdk/request/DownloadRequest.java | 14 ++++ .../sop/sdk/request/ProductDownloadModel.java | 11 ++++ .../sdk/request/ProductDownloadRequest.java | 15 +++++ .../java/com/gitee/sop/sdk/util/FileUtil.java | 10 +++ .../test/java/com/gitee/sop/sdk/SdkTest.java | 40 ++++++++++-- 13 files changed, 250 insertions(+), 17 deletions(-) create mode 100644 sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/FileResult.java create mode 100644 sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/DownloadAware.java create mode 100644 sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/DownloadRequest.java create mode 100644 sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/ProductDownloadModel.java create mode 100644 sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/ProductDownloadRequest.java diff --git a/changelog.md b/changelog.md index f776df78..c27b9157 100755 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,7 @@ ## 日常更新 +- 2025-06-11:java-sdk添加文件下载示例 - 2025-06-01:OpenContext添加charset字段 - 2025-05-18:修复网关registerAddress配置 - 2025-05-11: diff --git a/sop-sdk/sdk-java/pom.xml b/sop-sdk/sdk-java/pom.xml index 2d6e7b13..e6f35427 100755 --- a/sop-sdk/sdk-java/pom.xml +++ b/sop-sdk/sdk-java/pom.xml @@ -33,6 +33,11 @@ commons-logging 1.3.3 + + commons-io + commons-io + 2.17.0 + junit diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenClient.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenClient.java index d91fd3bc..83130b3c 100755 --- a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenClient.java +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenClient.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.parser.Feature; import com.gitee.sop.sdk.common.DataNameBuilder; +import com.gitee.sop.sdk.common.FileResult; import com.gitee.sop.sdk.common.OpenConfig; import com.gitee.sop.sdk.common.RequestForm; import com.gitee.sop.sdk.common.Result; @@ -11,15 +12,23 @@ import com.gitee.sop.sdk.common.SopSdkConstants; import com.gitee.sop.sdk.common.SopSdkErrors; import com.gitee.sop.sdk.exception.SdkException; import com.gitee.sop.sdk.request.BaseRequest; -import com.gitee.sop.sdk.sign.SopSignException; +import com.gitee.sop.sdk.request.DownloadAware; +import com.gitee.sop.sdk.request.DownloadRequest; import com.gitee.sop.sdk.sign.SignUtil; +import com.gitee.sop.sdk.sign.SopSignException; import com.gitee.sop.sdk.sign.StringUtils; +import com.gitee.sop.sdk.util.FileUtil; +import okhttp3.Headers; +import okhttp3.Response; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.io.IOException; +import java.io.InputStream; import java.util.Collections; import java.util.Map; + /** * 请求客户端,申明一个即可 * @@ -138,6 +147,15 @@ public class OpenClient { return this.execute(request, null); } + public FileResult download(DownloadRequest request) { + return download(request, null); + } + + public FileResult download(DownloadRequest request, String accessToken) { + Result result = execute(request, accessToken); + return result.getData(); + } + /** * 请求接口 * @@ -165,17 +183,41 @@ public class OpenClient { form.put(this.openConfig.getSignName(), sign); - String resp = doExecute(this.url, requestForm, Collections.emptyMap()); if (log.isDebugEnabled()) { log.debug("----------- 请求信息 -----------" + "\n请求参数:" + SignUtil.getSignContent(form) + "\n待签名内容:" + content + "\n签名(sign):" + sign - + "\n----------- 返回结果 -----------" - + "\n" + resp ); } - return this.parseResponse(resp, request); + + if (request instanceof DownloadAware) { + try (Response response = openRequest.download(url, requestForm, Collections.emptyMap())) { + Result result = new Result<>(); + FileResult fileResult = buildFileResult(response); + result.setData(fileResult); + return result; + } + } else { + String resp = doExecute(this.url, requestForm, Collections.emptyMap()); + if (log.isDebugEnabled()) { + log.debug("----------- 返回结果 -----------" + "\n" + resp); + } + return this.parseResponse(resp, request); + } + } + + protected FileResult buildFileResult(Response response) { + FileResult fileResult = new FileResult(); + Headers headers = response.headers(); + InputStream inputStream = response.body().byteStream(); + try { + fileResult.setFileData(FileUtil.toBytes(inputStream)); + } catch (IOException e) { + log.error("文件不存在", e); + } + fileResult.setHeaders(headers); + return fileResult; } protected String doExecute(String url, RequestForm requestForm, Map header) { diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenHttp.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenHttp.java index 5afc65b3..286ff3e6 100755 --- a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenHttp.java +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenHttp.java @@ -81,6 +81,23 @@ public class OpenHttp { return response.body().string(); } + /** + * get请求 + * + * @param url + * @param header + * @return + * @throws IOException + */ + public Response download(String url, Map header) throws IOException { + Request.Builder builder = new Request.Builder().url(url).get(); + // 添加header + addHeader(builder, header); + + Request request = builder.build(); + return httpClient.newCall(request).execute(); + } + /** * 请求json数据,contentType=application/json * @@ -135,6 +152,27 @@ public class OpenHttp { } } + /** + * 提交表单,下载文件 + * + * @param url url + * @param form 参数 + * @param header header + * @param method 请求方式,post,get等 + * @return 返回结果 + * @throws IOException + */ + public Response download(String url, Map form, Map header, RequestMethod method) throws IOException { + Request.Builder requestBuilder = buildRequestBuilder(url, form, method); + // 添加header + addHeader(requestBuilder, header); + + Request request = requestBuilder.build(); + return httpClient + .newCall(request) + .execute(); + } + public static Request.Builder buildRequestBuilder(String url, Map form, RequestMethod method) { switch (method) { case GET: @@ -188,6 +226,26 @@ public class OpenHttp { */ public String requestFile(String url, Map form, Map header, List files) throws IOException { + Response response = requestFileAndDownload(url, form, header, files); + try { + return response.body().string(); + } finally { + response.close(); + } + } + + /** + * 提交表单,并且上传文件 + * + * @param url + * @param form + * @param header + * @param files + * @return + * @throws IOException + */ + public Response requestFileAndDownload(String url, Map form, Map header, List files) + throws IOException { // 创建MultipartBody.Builder,用于添加请求的数据 MultipartBody.Builder bodyBuilder = new MultipartBody.Builder(); bodyBuilder.setType(MultipartBody.FORM); @@ -217,12 +275,7 @@ public class OpenHttp { addHeader(builder, header); Request request = builder.build(); - Response response = httpClient.newCall(request).execute(); - try { - return response.body().string(); - } finally { - response.close(); - } + return httpClient.newCall(request).execute(); } private void addHeader(Request.Builder builder, Map header) { diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenRequest.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenRequest.java index f6f8cff8..6b854382 100755 --- a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenRequest.java +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenRequest.java @@ -7,6 +7,7 @@ import com.gitee.sop.sdk.common.RequestMethod; import com.gitee.sop.sdk.common.Result; import com.gitee.sop.sdk.common.SopSdkErrors; import com.gitee.sop.sdk.common.UploadFile; +import okhttp3.Response; import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -50,6 +51,29 @@ public class OpenRequest { } } + public Response download(String url, RequestForm requestForm, Map header) { + try { + Map form = requestForm.getForm(); + List files = requestForm.getFiles(); + if (files != null && files.size() > 0) { + return openHttp.requestFileAndDownload(url, form, header, files); + } else { + RequestMethod requestMethod = requestForm.getRequestMethod(); + if (requestMethod == RequestMethod.GET) { + String query = this.buildGetQueryString(form, requestForm.getCharset()); + if (query != null && query.length() > 0) { + url = url + "?" + query; + } + return openHttp.download(url, header); + } else { + return openHttp.download(url, form, header, requestMethod); + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + protected String buildGetQueryString(Map params, String charset) throws UnsupportedEncodingException { if (params == null || params.size() == 0) { return ""; diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/FileResult.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/FileResult.java new file mode 100644 index 00000000..e626add4 --- /dev/null +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/FileResult.java @@ -0,0 +1,17 @@ +package com.gitee.sop.sdk.common; + +import lombok.Getter; +import lombok.Setter; +import okhttp3.Headers; + +/** + * @author 六如 + */ +@Setter +@Getter +public class FileResult { + private byte[] fileData; + + private Headers headers; + +} diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/BaseRequest.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/BaseRequest.java index 22bcccc6..86d25e45 100755 --- a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/BaseRequest.java +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/BaseRequest.java @@ -50,7 +50,11 @@ public abstract class BaseRequest { */ private List files; - private Class responseClass = (Class) ClassUtil.getSuperClassGenricType(this.getClass(), 0);; + private Class responseClass = parseResponseClass(); + + protected Class parseResponseClass() { + return (Class) ClassUtil.getSuperClassGenricType(this.getClass(), 0); + } /** * 定义接口名称 diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/DownloadAware.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/DownloadAware.java new file mode 100644 index 00000000..7421ded9 --- /dev/null +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/DownloadAware.java @@ -0,0 +1,7 @@ +package com.gitee.sop.sdk.request; + +/** + * @author 六如 + */ +public interface DownloadAware { +} diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/DownloadRequest.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/DownloadRequest.java new file mode 100644 index 00000000..92388098 --- /dev/null +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/DownloadRequest.java @@ -0,0 +1,14 @@ +package com.gitee.sop.sdk.request; + +import com.gitee.sop.sdk.common.FileResult; + +/** + * @author 六如 + */ +public abstract class DownloadRequest extends BaseRequest implements DownloadAware { + + @Override + protected Class parseResponseClass() { + return FileResult.class; + } +} diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/ProductDownloadModel.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/ProductDownloadModel.java new file mode 100644 index 00000000..93b8ae8c --- /dev/null +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/ProductDownloadModel.java @@ -0,0 +1,11 @@ +package com.gitee.sop.sdk.request; + +import lombok.Data; + +/** + * @author 六如 + */ +@Data +public class ProductDownloadModel { + private Integer id; +} diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/ProductDownloadRequest.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/ProductDownloadRequest.java new file mode 100644 index 00000000..f0e620a5 --- /dev/null +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/request/ProductDownloadRequest.java @@ -0,0 +1,15 @@ +package com.gitee.sop.sdk.request; + +import lombok.Data; + +/** + * @author 六如 + */ +@Data +public class ProductDownloadRequest extends DownloadRequest { + @Override + protected String method() { + return "product.download"; + } + +} diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/util/FileUtil.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/util/FileUtil.java index c466b66e..5f740585 100755 --- a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/util/FileUtil.java +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/util/FileUtil.java @@ -1,14 +1,18 @@ package com.gitee.sop.sdk.util; +import org.apache.commons.io.IOUtils; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.Charset; /** * 文件工具类 + * * @author 六如 */ public class FileUtil { @@ -21,6 +25,7 @@ public class FileUtil { /** * 将文件流转换成byte[] + * * @param input * @return * @throws IOException @@ -38,6 +43,7 @@ public class FileUtil { /** * 将文件转换成数据流 + * * @param file 文件 * @return 返回数据流 * @throws IOException @@ -66,4 +72,8 @@ public class FileUtil { } } } + + public static String toString(InputStream inputStream, Charset charset) throws IOException { + return IOUtils.toString(inputStream, charset); + } } diff --git a/sop-sdk/sdk-java/src/test/java/com/gitee/sop/sdk/SdkTest.java b/sop-sdk/sdk-java/src/test/java/com/gitee/sop/sdk/SdkTest.java index 0dfe5a7f..204cbbd5 100755 --- a/sop-sdk/sdk-java/src/test/java/com/gitee/sop/sdk/SdkTest.java +++ b/sop-sdk/sdk-java/src/test/java/com/gitee/sop/sdk/SdkTest.java @@ -2,6 +2,7 @@ package com.gitee.sop.sdk; import com.alibaba.fastjson.JSON; import com.gitee.sop.sdk.client.OpenClient; +import com.gitee.sop.sdk.common.FileResult; import com.gitee.sop.sdk.common.Result; import com.gitee.sop.sdk.common.UploadFile; import com.gitee.sop.sdk.model.DemoFileUploadModel; @@ -10,17 +11,22 @@ import com.gitee.sop.sdk.request.DemoFileUploadRequest; import com.gitee.sop.sdk.request.GetProductRequest; import com.gitee.sop.sdk.request.PayTradeWapPayModel; import com.gitee.sop.sdk.request.PayTradeWapPayRequest; +import com.gitee.sop.sdk.request.ProductDownloadModel; +import com.gitee.sop.sdk.request.ProductDownloadRequest; import com.gitee.sop.sdk.response.GetProductResponse; +import com.gitee.sop.sdk.response.PayTradeWapPayResponse; +import junit.framework.TestCase; +import okhttp3.Headers; +import org.apache.commons.io.IOUtils; +import org.junit.Assert; +import org.junit.Test; + import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Date; -import com.gitee.sop.sdk.response.PayTradeWapPayResponse; -import junit.framework.TestCase; -import org.junit.Test; - public class SdkTest extends TestCase { String url = "http://localhost:8081/api"; @@ -87,7 +93,7 @@ public class SdkTest extends TestCase { DemoFileUploadModel model = new DemoFileUploadModel(); model.setProductName("上传文件参数"); - model.setAddTime( new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + model.setAddTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); request.setBizModel(model); String root = System.getProperty("user.dir"); @@ -108,4 +114,28 @@ public class SdkTest extends TestCase { System.out.println("--------------------"); } + // 文件下载 + @Test + public void testDownload() throws IOException { + ProductDownloadRequest request = new ProductDownloadRequest(); + + ProductDownloadModel model = new ProductDownloadModel(); + model.setId(111); + request.setBizModel(model); + + FileResult result = client.download(request); + // 文件流 + byte[] fileData = result.getFileData(); + String content = IOUtils.toString(fileData, "UTF-8"); + System.out.println("下载文件内容:" + content); + Assert.assertEquals("abc,你好~!@#\n", content); + + System.out.println("----- header -----"); + Headers headers = result.getHeaders(); + for (String name : headers.names()) { + String value = headers.get(name); + System.out.println(name + ":" + value); + } + } + }