From 0cc8c0b9917b1098940940ef302da6cbea4512a2 Mon Sep 17 00:00:00 2001 From: tanghc Date: Wed, 9 Oct 2019 18:27:43 +0800 Subject: [PATCH] =?UTF-8?q?restful=E6=94=AF=E6=8C=81@PathVariable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zuul/route/SopRouteLocator.java | 3 +- .../zuul/route/ZuulRouteRepository.java | 33 ++++++++++++++++++- .../servercommon/manager/ApiMetaBuilder.java | 2 +- .../TraditionalWebappController.java | 11 +++++++ .../sop/gateway/controller/RestServlet.java | 19 ++++------- .../com/gitee/sop/gateway/UrlPatternTest.java | 30 +++++++++++++++++ 6 files changed, 83 insertions(+), 15 deletions(-) create mode 100644 sop-gateway/src/test/java/com/gitee/sop/gateway/UrlPatternTest.java diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/route/SopRouteLocator.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/route/SopRouteLocator.java index e28a7b50..ce07b1ca 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/route/SopRouteLocator.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/route/SopRouteLocator.java @@ -1,5 +1,6 @@ package com.gitee.sop.gatewaycommon.zuul.route; +import com.gitee.sop.gatewaycommon.bean.AbstractTargetRoute; import com.gitee.sop.gatewaycommon.param.ApiParam; import com.gitee.sop.gatewaycommon.zuul.ZuulContext; import org.springframework.cloud.netflix.zuul.filters.Route; @@ -33,7 +34,7 @@ public class SopRouteLocator implements RouteLocator, Ordered { public List getRoutes() { return zuulRouteRepository.getAll() .parallelStream() - .map(zuulTargetRoute -> zuulTargetRoute.getTargetRouteDefinition()) + .map(AbstractTargetRoute::getTargetRouteDefinition) .collect(Collectors.toList()); } diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/route/ZuulRouteRepository.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/route/ZuulRouteRepository.java index 1f50f0b0..d1479d97 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/route/ZuulRouteRepository.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/route/ZuulRouteRepository.java @@ -1,6 +1,9 @@ package com.gitee.sop.gatewaycommon.zuul.route; import com.gitee.sop.gatewaycommon.manager.RouteRepository; +import org.springframework.cloud.netflix.zuul.filters.Route; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; import java.util.Collection; import java.util.List; @@ -14,6 +17,9 @@ import java.util.stream.Collectors; * @author tanghc */ public class ZuulRouteRepository implements RouteRepository { + + private PathMatcher pathMatcher = new AntPathMatcher(); + /** * key:nameVersion */ @@ -24,7 +30,32 @@ public class ZuulRouteRepository implements RouteRepository { if (id == null) { return null; } - return nameVersionTargetRouteMap.get(id); + ZuulTargetRoute zuulTargetRoute = nameVersionTargetRouteMap.get(id); + if (zuulTargetRoute != null) { + return zuulTargetRoute; + } + for (Map.Entry entry : nameVersionTargetRouteMap.entrySet()) { + String pattern = entry.getKey(); + if (this.pathMatcher.match(pattern, id)) { + return clone(id, entry.getValue()); + } + } + return null; + } + + private ZuulTargetRoute clone(String path, ZuulTargetRoute zuulTargetRoute) { + Route targetRouteDefinition = zuulTargetRoute.getTargetRouteDefinition(); + Route route = new Route( + targetRouteDefinition.getId() + ,path + ,targetRouteDefinition.getLocation() + ,targetRouteDefinition.getPrefix() + ,targetRouteDefinition.getRetryable() + , null + ); + return new ZuulTargetRoute(zuulTargetRoute.getServiceRouteInfo() + , zuulTargetRoute.getRouteDefinition() + , route); } @Override diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/manager/ApiMetaBuilder.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/manager/ApiMetaBuilder.java index f705461d..d23d4cf0 100644 --- a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/manager/ApiMetaBuilder.java +++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/manager/ApiMetaBuilder.java @@ -95,7 +95,7 @@ public class ApiMetaBuilder { if (path.contains("$") || isIgnorePattern(path)) { return null; } - ServiceApiInfo.ApiMeta apiMeta = new ServiceApiInfo.ApiMeta(path, path, "1.0"); + ServiceApiInfo.ApiMeta apiMeta = new ServiceApiInfo.ApiMeta(path, path, ""); apiMeta.setIgnoreValidate(BooleanUtils.toInteger(true)); apiMeta.setMergeResult(BooleanUtils.toInteger(false)); apiMeta.setPermission(BooleanUtils.toInteger(false)); diff --git a/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/controller/TraditionalWebappController.java b/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/controller/TraditionalWebappController.java index 3338c937..64752165 100644 --- a/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/controller/TraditionalWebappController.java +++ b/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/controller/TraditionalWebappController.java @@ -2,6 +2,7 @@ package com.gitee.sop.storyweb.controller; import com.gitee.sop.servercommon.util.UploadUtil; import lombok.Data; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -14,6 +15,7 @@ import java.util.Collection; /** * 传统web开发实例 + * * @author tanghc */ @RestController @@ -72,6 +74,15 @@ public class TraditionalWebappController { return food; } + // http://localhost:2222/food/get/3 本地 + // http://localhost:8081/rest/food/get/3 网关访问 + @RequestMapping("/get/{id}") + public Food getById(@PathVariable("id") Integer id) { + Food food = new Food(); + food.setId(id); + return food; + } + @Data public static class Food { private Integer id; diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/controller/RestServlet.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/controller/RestServlet.java index 77f7a7b7..0eda32c3 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/controller/RestServlet.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/controller/RestServlet.java @@ -19,13 +19,13 @@ import java.io.IOException; @WebServlet(urlPatterns = "/rest/*") public class RestServlet extends HttpServlet { - private static final String REST_PATH = "/rest"; + private static final String EMPTY_VERSION = ""; @Value("${zuul.servlet-path:/zuul}") private String path; - @Value("${zuul.rest-default-version:1.0}") - private String defaultVersion; + @Value("${sop.restful.path:/rest}") + private String restPath; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { @@ -35,16 +35,11 @@ public class RestServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String url = request.getRequestURL().toString(); - int index = url.indexOf(REST_PATH); + int index = url.indexOf(restPath); // 取/rest的后面部分 - String path = url.substring(index + REST_PATH.length()); - String method = path; - String version = request.getParameter(ParamNames.VERSION_NAME); - if (version == null) { - version = defaultVersion; - } - request.setAttribute(SopConstants.REDIRECT_METHOD_KEY, method); - request.setAttribute(SopConstants.REDIRECT_VERSION_KEY, version); + String path = url.substring(index + restPath.length()); + request.setAttribute(SopConstants.REDIRECT_METHOD_KEY, path); + request.setAttribute(SopConstants.REDIRECT_VERSION_KEY, EMPTY_VERSION); request.getRequestDispatcher(this.path).forward(request, response); } diff --git a/sop-gateway/src/test/java/com/gitee/sop/gateway/UrlPatternTest.java b/sop-gateway/src/test/java/com/gitee/sop/gateway/UrlPatternTest.java new file mode 100644 index 00000000..655bef17 --- /dev/null +++ b/sop-gateway/src/test/java/com/gitee/sop/gateway/UrlPatternTest.java @@ -0,0 +1,30 @@ +package com.gitee.sop.gateway; + +import junit.framework.TestCase; +import org.junit.Assert; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; + +/** + * @author tanghc + */ +public class UrlPatternTest extends TestCase { + + private PathMatcher pathMatcher = new AntPathMatcher(); + + public void testA() { + Assert.assertTrue(match("/food/get/{id}", "/food/get/2")); + Assert.assertTrue(match("/food/get/{id}1.0", "/food/get/21.0")); + } + + /** + * @param pattern food/get/{id} + * @param lookupPath /food/get/2 + * + * @return + */ + public boolean match(String pattern, String lookupPath) { + return this.pathMatcher.match(pattern, lookupPath); + } + +}