From a814b9e5981aa318f41ec5e06cfa902780589d15 Mon Sep 17 00:00:00 2001 From: wangyu <727842003@qq.com> Date: Wed, 1 Feb 2023 15:37:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8D=87=E7=BA=A71.0.8=E3=80=82?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E5=92=8C?= =?UTF-8?q?=E4=BC=A0=E9=80=92body=E6=97=B6param=E4=B8=A2=E5=A4=B1=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E3=80=82=20fix:=20=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=E6=B5=8B=E8=AF=95=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 ++-- rest-proxy-api/pom.xml | 2 +- rest-proxy-core/pom.xml | 2 +- .../configuration/RestClientProperties.java | 2 +- .../rest/core/client/DefaultRestClient.java | 11 +++++----- .../core/resolver/HttpDeleteResolver.java | 3 +-- .../rest/core/resolver/HttpGetResolver.java | 3 +-- .../rest/core/resolver/HttpPostResolver.java | 4 +++- .../support/AbstractBodyResolver.java | 16 ++++++++++----- .../support/AbstractParamResolver.java | 3 ++- .../rest/registry/proxy/RestInvokers.java | 20 ++++++++++++++----- .../group/flyfish/rest/MultipartTest.java | 4 ++-- 12 files changed, 46 insertions(+), 28 deletions(-) diff --git a/pom.xml b/pom.xml index 45b7f4b..a54565d 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ group.flyfish rest-proxy - 1.0.7 + 1.0.8 8 @@ -22,7 +22,7 @@ 1.8 4.4 2.6 - 1.0.7 + 1.0.8 pom diff --git a/rest-proxy-api/pom.xml b/rest-proxy-api/pom.xml index 27a8d42..137b3e7 100644 --- a/rest-proxy-api/pom.xml +++ b/rest-proxy-api/pom.xml @@ -5,7 +5,7 @@ group.flyfish rest-proxy - 1.0.7 + 1.0.8 4.0.0 diff --git a/rest-proxy-core/pom.xml b/rest-proxy-core/pom.xml index a94c3bf..9481871 100644 --- a/rest-proxy-core/pom.xml +++ b/rest-proxy-core/pom.xml @@ -5,7 +5,7 @@ group.flyfish rest-proxy - 1.0.7 + 1.0.8 4.0.0 diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/configuration/RestClientProperties.java b/rest-proxy-core/src/main/java/group/flyfish/rest/configuration/RestClientProperties.java index a163bb6..e62939d 100644 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/configuration/RestClientProperties.java +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/configuration/RestClientProperties.java @@ -103,6 +103,6 @@ public class RestClientProperties implements InitializingBean { if (DataUtils.isNotEmpty(configures)) { configures.forEach(item -> item.configure(this)); } - RestInvokers.forEach(invoker -> invoker.configure(this)); + RestInvokers.configure(this); } } diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/core/client/DefaultRestClient.java b/rest-proxy-core/src/main/java/group/flyfish/rest/core/client/DefaultRestClient.java index e8771f1..80a41c6 100644 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/core/client/DefaultRestClient.java +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/core/client/DefaultRestClient.java @@ -14,6 +14,7 @@ import org.apache.http.StatusLine; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.util.EntityUtils; +import org.springframework.http.HttpStatus; import org.springframework.lang.Nullable; import org.springframework.util.StreamUtils; @@ -286,17 +287,17 @@ final class DefaultRestClient implements RestClient { log.info("【Rest Invoke】{} {}", request.getMethod(), request.getURI()); try (CloseableHttpResponse response = clientProvider.getClient().execute(request)) { StatusLine statusLine = response.getStatusLine(); - if (200 == statusLine.getStatusCode()) { + if (HttpStatus.valueOf(statusLine.getStatusCode()).isError()) { + int requestCode = statusLine.getStatusCode(); + log.error(request.getURI() + "接口调用失败,code:" + requestCode); + handleError(new RestClientException("网络请求状态异常!代码:" + requestCode, null, statusLine)); + } else { HttpEntity entity = response.getEntity(); if (consumer != null) { consumer.accept(entity); return null; } return resolveResponse(entity); - } else { - int requestCode = statusLine.getStatusCode(); - log.error(request.getURI() + "接口调用失败,code:" + requestCode); - handleError(new RestClientException("网络请求状态异常!代码:" + requestCode, null, statusLine)); } } catch (UnknownHostException e) { handleError(new RestClientException(e.getMessage(), e, null)); diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/HttpDeleteResolver.java b/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/HttpDeleteResolver.java index ea4ee88..d7983d6 100644 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/HttpDeleteResolver.java +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/HttpDeleteResolver.java @@ -20,7 +20,6 @@ public class HttpDeleteResolver extends AbstractParamResolver implements HttpMet */ @Override public HttpRequestBase resolve(RestClientBuilder builder) { - resolveParams(builder); - return new HttpDelete(builder.getUrl()); + return new HttpDelete(resolveParams(builder).getUrl()); } } diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/HttpGetResolver.java b/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/HttpGetResolver.java index e678cf9..9f440a1 100644 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/HttpGetResolver.java +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/HttpGetResolver.java @@ -12,7 +12,6 @@ public class HttpGetResolver extends AbstractParamResolver implements HttpMethod @Override public HttpRequestBase resolve(RestClientBuilder builder) { - resolveParams(builder); - return new HttpGet(builder.getUrl()); + return new HttpGet(resolveParams(builder).getUrl()); } } diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/HttpPostResolver.java b/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/HttpPostResolver.java index 5a0bb3b..994d334 100644 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/HttpPostResolver.java +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/HttpPostResolver.java @@ -2,6 +2,7 @@ package group.flyfish.rest.core.resolver; import group.flyfish.rest.core.client.RestClientBuilder; import group.flyfish.rest.core.resolver.support.AbstractBodyResolver; +import org.apache.http.HttpEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; @@ -12,8 +13,9 @@ public class HttpPostResolver extends AbstractBodyResolver implements HttpMethod @Override public HttpRequestBase resolve(RestClientBuilder builder) { + HttpEntity entity = buildEntity(builder); HttpPost post = new HttpPost(builder.getUrl()); - post.setEntity(buildEntity(builder)); + post.setEntity(entity); return post; } diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/support/AbstractBodyResolver.java b/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/support/AbstractBodyResolver.java index 55e4ecf..4e67051 100644 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/support/AbstractBodyResolver.java +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/support/AbstractBodyResolver.java @@ -25,18 +25,21 @@ import static group.flyfish.rest.constants.RestConstants.MIME_MAP; * * @author wangyu */ -public abstract class AbstractBodyResolver { +public abstract class AbstractBodyResolver extends AbstractParamResolver { /** * 构建entity + * 对于纯urlencoded form,我们将所有参数处理为formdata + * 对于上传和body请求,我们照旧处理query * * @param builder 构建器 * @return 结果 */ protected HttpEntity buildEntity(RestClientBuilder builder) { - return builder.isMultipart() ? buildMultipart(builder) - : DataUtils.isNotBlank(builder.getBody()) ? buildJson(builder) - : buildFormData(builder); + return builder.isMultipart() ? buildMultipart(resolveParams(builder)) : + DataUtils.isNotBlank(builder.getBody()) ? + buildJson(resolveParams(builder)) : + buildFormData(builder); } /** @@ -48,6 +51,7 @@ public abstract class AbstractBodyResolver { private HttpEntity buildMultipart(RestClientBuilder clientBuilder) { MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); + builder.setCharset(clientBuilder.getCharset()); clientBuilder.getMultipartList().forEach(multipart -> { Object data = multipart.getData(); String name = multipart.getName(); @@ -59,9 +63,11 @@ public abstract class AbstractBodyResolver { } else if (data instanceof InputStream) { builder.addBinaryBody(name, (InputStream) data, resolveType(filename), filename); } else { - throw new IllegalArgumentException("上传时,输入的数据不被支持!"); + // 对于无法识别的内容,统一处理为string + builder.addTextBody(name, String.valueOf(data)); } }); + // 处理query参数 return builder.build(); } diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/support/AbstractParamResolver.java b/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/support/AbstractParamResolver.java index 61149e2..1175aff 100644 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/support/AbstractParamResolver.java +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/core/resolver/support/AbstractParamResolver.java @@ -17,7 +17,7 @@ public abstract class AbstractParamResolver { * * @param builder 构建器 */ - protected void resolveParams(RestClientBuilder builder) { + protected RestClientBuilder resolveParams(RestClientBuilder builder) { if (DataUtils.isNotEmpty(builder.getParams())) { String start = builder.getUrl().contains("?") ? "&" : "?"; String params = builder.getParams().entrySet().stream() @@ -25,5 +25,6 @@ public abstract class AbstractParamResolver { .collect(Collectors.joining("&")); builder.url(builder.getUrl() + start + params); } + return builder; } } diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/registry/proxy/RestInvokers.java b/rest-proxy-core/src/main/java/group/flyfish/rest/registry/proxy/RestInvokers.java index 3a1cb00..6f11a71 100644 --- a/rest-proxy-core/src/main/java/group/flyfish/rest/registry/proxy/RestInvokers.java +++ b/rest-proxy-core/src/main/java/group/flyfish/rest/registry/proxy/RestInvokers.java @@ -1,8 +1,9 @@ package group.flyfish.rest.registry.proxy; +import group.flyfish.rest.configuration.RestClientProperties; + import java.util.ArrayList; import java.util.List; -import java.util.function.Consumer; /** * rest执行器实例集合 @@ -11,13 +12,22 @@ import java.util.function.Consumer; */ public class RestInvokers { - private static final List invokers = new ArrayList<>(); + private static RestClientProperties properties; + + private static List invokers = new ArrayList<>(); public static void add(RestProxyInvoker invoker) { - invokers.add(invoker); + if (null != properties) { + invoker.configure(properties); + } else { + invokers.add(invoker); + } } - public static void forEach(Consumer handler) { - invokers.forEach(handler); + public static synchronized void configure(RestClientProperties properties) { + invokers.forEach(invoker -> invoker.configure(properties)); + invokers.clear(); + invokers = null; + RestInvokers.properties = properties; } } diff --git a/rest-proxy-core/src/test/java/group/flyfish/rest/MultipartTest.java b/rest-proxy-core/src/test/java/group/flyfish/rest/MultipartTest.java index 51afbca..53074a6 100644 --- a/rest-proxy-core/src/test/java/group/flyfish/rest/MultipartTest.java +++ b/rest-proxy-core/src/test/java/group/flyfish/rest/MultipartTest.java @@ -38,7 +38,7 @@ public class MultipartTest { @Test public void test() { File file = new File("/Users/wangyu/Desktop/2022年终述职报告.docx"); - String filename = testRestService.uploadPart(new Multipart("file", file.getName(), file)); + String filename = testRestService.uploadPart(new Multipart("file", file.getName(), file), file.getName(), 55L); System.out.println(filename); try (InputStream in = Files.newInputStream(file.toPath())) { filename = testRestService.uploadAnno(in, file.getName()); @@ -58,7 +58,7 @@ public class MultipartTest { public interface TestRestService { @RestApi(uri = "/files", method = HttpMethod.POST) - String uploadPart(@RestPart Multipart file); + String uploadPart(@RestPart Multipart file, String name, @RestPart("token") Long token); @RestApi(uri = "/files", method = HttpMethod.POST) String uploadAnno(@RestPart("fbl") InputStream file, @RestPart.Filename("fbl") String name);