diff --git a/common/src/main/java/ink/wgink/common/rpc/rest/handler/RestRemoteHandler.java b/common/src/main/java/ink/wgink/common/rpc/rest/handler/RestRemoteHandler.java index be9a30a9..af121ffb 100644 --- a/common/src/main/java/ink/wgink/common/rpc/rest/handler/RestRemoteHandler.java +++ b/common/src/main/java/ink/wgink/common/rpc/rest/handler/RestRemoteHandler.java @@ -1,5 +1,6 @@ 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.RemoteGetMethod; import ink.wgink.annotation.rpc.rest.method.RemotePostMethod; @@ -52,10 +53,13 @@ public class RestRemoteHandler implements InvocationHandler { if (method.getParameters().length == 0) { throw new ParamsException("方法没有参数"); } + RemoteService remoteService = method.getDeclaringClass().getAnnotation(RemoteService.class); + String baseUri = remoteService.value(); String remotePath = getRemotePath(method.getParameters(), args); checkRemotePath(remotePath); Map pathVariableParams = getPathVariableParams(method.getParameters(), args); Map queryVariableParams = getQueryVariableParams(method.getParameters(), args); + Map queryMapParams = getQueryMapParams(method.getParameters(), args); Map headerVariableParams = getHeaderVariableParams(method.getParameters(), args); MultiValueMap formVariableParams = null; String uri; @@ -92,8 +96,8 @@ public class RestRemoteHandler implements InvocationHandler { List pathVariable = listPathVariables(uri); checkPathVariables(pathVariable); checkPathVariableParams(pathVariable, pathVariableParams); - uri = buildUri(uri, pathVariable, pathVariableParams); - String remoteFullPath = buildFullUri(remotePath, uri, queryVariableParams); + uri = buildUri(baseUri, uri, pathVariable, pathVariableParams); + String remoteFullPath = buildFullUri(remotePath, uri, queryVariableParams, queryMapParams); RestRemoteRequest restRemoteRequest = new RestRemoteRequest(); return restRemoteRequest.request(requestMethod, remoteFullPath, headerVariableParams, formVariableParams, requestBody, method.getGenericReturnType()); } @@ -246,6 +250,37 @@ public class RestRemoteHandler implements InvocationHandler { return null; } + + /** + * 查询Map参数 + * + * @param parameters + * @param args + * @return + * @throws UnsupportedEncodingException + */ + private Map 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 argMap = (Map) args[i]; + Map queryMap = new HashMap<>(); + for (Map.Entry 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 * @return */ - private String buildUri(String uri, List pathVariables, Map pathVariableParams) { + private String buildUri(String baseUri, String uri, List pathVariables, Map 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; for (String pathVariable : pathVariables) { 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 uri 请求路径 * @param queryVariableParams 查询参数 + * @param queryMapParams 查询Map参数 * @return * @throws UnsupportedEncodingException */ - private String buildFullUri(String remotePath, String uri, Map queryVariableParams) { + private String buildFullUri(String remotePath, String uri, Map queryVariableParams, Map queryMapParams) { String remote = remotePath.endsWith("/") ? remotePath.substring(0, remotePath.length() - 1) : remotePath; - if (queryVariableParams.isEmpty()) { + if (queryVariableParams.isEmpty() && queryMapParams.isEmpty()) { return remotePath + uri; } StringBuilder queryParams = new StringBuilder(); @@ -357,6 +400,12 @@ public class RestRemoteHandler implements InvocationHandler { } queryParams.append(kv.getKey()).append("=").append(kv.getValue()); } + for (Map.Entry kv : queryVariableParams.entrySet()) { + if (queryParams.length() > 0) { + queryParams.append("&"); + } + queryParams.append(kv.getKey()).append("=").append(kv.getValue()); + } return remote + uri + "?" + queryParams; }