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);