新增@RemoteService的value处理,和@RemoteQueryMapParams注解

This commit is contained in:
wanggeng 2021-09-22 22:53:19 +08:00
parent 2c165fc97c
commit 01490c5f77

View File

@ -1,5 +1,6 @@
package ink.wgink.common.rpc.rest.handler; package ink.wgink.common.rpc.rest.handler;
import ink.wgink.annotation.rpc.rest.RemoteService;
import ink.wgink.annotation.rpc.rest.method.RemoteDeleteMethod; import ink.wgink.annotation.rpc.rest.method.RemoteDeleteMethod;
import ink.wgink.annotation.rpc.rest.method.RemoteGetMethod; import ink.wgink.annotation.rpc.rest.method.RemoteGetMethod;
import ink.wgink.annotation.rpc.rest.method.RemotePostMethod; import ink.wgink.annotation.rpc.rest.method.RemotePostMethod;
@ -52,10 +53,13 @@ public class RestRemoteHandler implements InvocationHandler {
if (method.getParameters().length == 0) { if (method.getParameters().length == 0) {
throw new ParamsException("方法没有参数"); throw new ParamsException("方法没有参数");
} }
RemoteService remoteService = method.getDeclaringClass().getAnnotation(RemoteService.class);
String baseUri = remoteService.value();
String remotePath = getRemotePath(method.getParameters(), args); String remotePath = getRemotePath(method.getParameters(), args);
checkRemotePath(remotePath); checkRemotePath(remotePath);
Map<String, String> pathVariableParams = getPathVariableParams(method.getParameters(), args); Map<String, String> pathVariableParams = getPathVariableParams(method.getParameters(), args);
Map<String, String> queryVariableParams = getQueryVariableParams(method.getParameters(), args); Map<String, String> queryVariableParams = getQueryVariableParams(method.getParameters(), args);
Map<String, String> queryMapParams = getQueryMapParams(method.getParameters(), args);
Map<String, String> headerVariableParams = getHeaderVariableParams(method.getParameters(), args); Map<String, String> headerVariableParams = getHeaderVariableParams(method.getParameters(), args);
MultiValueMap<String, Object> formVariableParams = null; MultiValueMap<String, Object> formVariableParams = null;
String uri; String uri;
@ -92,8 +96,8 @@ public class RestRemoteHandler implements InvocationHandler {
List<String> pathVariable = listPathVariables(uri); List<String> pathVariable = listPathVariables(uri);
checkPathVariables(pathVariable); checkPathVariables(pathVariable);
checkPathVariableParams(pathVariable, pathVariableParams); checkPathVariableParams(pathVariable, pathVariableParams);
uri = buildUri(uri, pathVariable, pathVariableParams); uri = buildUri(baseUri, uri, pathVariable, pathVariableParams);
String remoteFullPath = buildFullUri(remotePath, uri, queryVariableParams); String remoteFullPath = buildFullUri(remotePath, uri, queryVariableParams, queryMapParams);
RestRemoteRequest restRemoteRequest = new RestRemoteRequest(); RestRemoteRequest restRemoteRequest = new RestRemoteRequest();
return restRemoteRequest.request(requestMethod, remoteFullPath, headerVariableParams, formVariableParams, requestBody, method.getGenericReturnType()); return restRemoteRequest.request(requestMethod, remoteFullPath, headerVariableParams, formVariableParams, requestBody, method.getGenericReturnType());
} }
@ -246,6 +250,37 @@ public class RestRemoteHandler implements InvocationHandler {
return null; return null;
} }
/**
* 查询Map参数
*
* @param parameters
* @param args
* @return
* @throws UnsupportedEncodingException
*/
private Map<String, String> getQueryMapParams(Parameter[] parameters, Object[] args) throws UnsupportedEncodingException {
for (int i = 0; i < parameters.length; i++) {
Parameter parameter = parameters[i];
if (!parameter.isAnnotationPresent(RemoteQueryParamsMap.class)) {
continue;
}
if (parameter.getType() != Map.class) {
continue;
}
if (args[i] == null) {
continue;
}
Map<String, Object> argMap = (Map<String, Object>) args[i];
Map<String, String> queryMap = new HashMap<>();
for (Map.Entry<String, Object> kv : argMap.entrySet()) {
queryMap.put(kv.getKey(), URLEncoder.encode(kv.getValue().toString(), "UTF-8"));
}
return queryMap;
}
return new HashMap<>();
}
/** /**
* 获取远程地址只取第一个 * 获取远程地址只取第一个
* *
@ -328,12 +363,19 @@ public class RestRemoteHandler implements InvocationHandler {
* @param pathVariableParams * @param pathVariableParams
* @return * @return
*/ */
private String buildUri(String uri, List<String> pathVariables, Map<String, String> pathVariableParams) { private String buildUri(String baseUri, String uri, List<String> pathVariables, Map<String, String> pathVariableParams) {
String resultBaseUri = baseUri;
if (!StringUtils.isBlank(baseUri)) {
for (String pathVariable : pathVariables) {
resultBaseUri = resultBaseUri.replace("{" + pathVariable + "}", pathVariableParams.get(pathVariable));
}
resultBaseUri = resultBaseUri.startsWith("/") ? resultBaseUri : "/" + resultBaseUri;
}
String resultUri = uri; String resultUri = uri;
for (String pathVariable : pathVariables) { for (String pathVariable : pathVariables) {
resultUri = resultUri.replace("{" + pathVariable + "}", pathVariableParams.get(pathVariable)); resultUri = resultUri.replace("{" + pathVariable + "}", pathVariableParams.get(pathVariable));
} }
return resultUri.startsWith("/") ? resultUri : "/" + resultUri; return resultBaseUri + (resultUri.startsWith("/") ? resultUri : "/" + resultUri);
} }
/** /**
@ -342,12 +384,13 @@ public class RestRemoteHandler implements InvocationHandler {
* @param remotePath 远程调用地址 * @param remotePath 远程调用地址
* @param uri 请求路径 * @param uri 请求路径
* @param queryVariableParams 查询参数 * @param queryVariableParams 查询参数
* @param queryMapParams 查询Map参数
* @return * @return
* @throws UnsupportedEncodingException * @throws UnsupportedEncodingException
*/ */
private String buildFullUri(String remotePath, String uri, Map<String, String> queryVariableParams) { private String buildFullUri(String remotePath, String uri, Map<String, String> queryVariableParams, Map<String, String> queryMapParams) {
String remote = remotePath.endsWith("/") ? remotePath.substring(0, remotePath.length() - 1) : remotePath; String remote = remotePath.endsWith("/") ? remotePath.substring(0, remotePath.length() - 1) : remotePath;
if (queryVariableParams.isEmpty()) { if (queryVariableParams.isEmpty() && queryMapParams.isEmpty()) {
return remotePath + uri; return remotePath + uri;
} }
StringBuilder queryParams = new StringBuilder(); StringBuilder queryParams = new StringBuilder();
@ -357,6 +400,12 @@ public class RestRemoteHandler implements InvocationHandler {
} }
queryParams.append(kv.getKey()).append("=").append(kv.getValue()); queryParams.append(kv.getKey()).append("=").append(kv.getValue());
} }
for (Map.Entry<String, String> kv : queryVariableParams.entrySet()) {
if (queryParams.length() > 0) {
queryParams.append("&");
}
queryParams.append(kv.getKey()).append("=").append(kv.getValue());
}
return remote + uri + "?" + queryParams; return remote + uri + "?" + queryParams;
} }