mirror of
https://gitee.com/durcframework/SOP.git
synced 2025-08-11 21:57:56 +08:00
restful支持@PathVariable
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package com.gitee.sop.gatewaycommon.zuul.route;
|
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.param.ApiParam;
|
||||||
import com.gitee.sop.gatewaycommon.zuul.ZuulContext;
|
import com.gitee.sop.gatewaycommon.zuul.ZuulContext;
|
||||||
import org.springframework.cloud.netflix.zuul.filters.Route;
|
import org.springframework.cloud.netflix.zuul.filters.Route;
|
||||||
@@ -33,7 +34,7 @@ public class SopRouteLocator implements RouteLocator, Ordered {
|
|||||||
public List<Route> getRoutes() {
|
public List<Route> getRoutes() {
|
||||||
return zuulRouteRepository.getAll()
|
return zuulRouteRepository.getAll()
|
||||||
.parallelStream()
|
.parallelStream()
|
||||||
.map(zuulTargetRoute -> zuulTargetRoute.getTargetRouteDefinition())
|
.map(AbstractTargetRoute::getTargetRouteDefinition)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,6 +1,9 @@
|
|||||||
package com.gitee.sop.gatewaycommon.zuul.route;
|
package com.gitee.sop.gatewaycommon.zuul.route;
|
||||||
|
|
||||||
import com.gitee.sop.gatewaycommon.manager.RouteRepository;
|
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.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -14,6 +17,9 @@ import java.util.stream.Collectors;
|
|||||||
* @author tanghc
|
* @author tanghc
|
||||||
*/
|
*/
|
||||||
public class ZuulRouteRepository implements RouteRepository<ZuulTargetRoute> {
|
public class ZuulRouteRepository implements RouteRepository<ZuulTargetRoute> {
|
||||||
|
|
||||||
|
private PathMatcher pathMatcher = new AntPathMatcher();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* key:nameVersion
|
* key:nameVersion
|
||||||
*/
|
*/
|
||||||
@@ -24,7 +30,32 @@ public class ZuulRouteRepository implements RouteRepository<ZuulTargetRoute> {
|
|||||||
if (id == null) {
|
if (id == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return nameVersionTargetRouteMap.get(id);
|
ZuulTargetRoute zuulTargetRoute = nameVersionTargetRouteMap.get(id);
|
||||||
|
if (zuulTargetRoute != null) {
|
||||||
|
return zuulTargetRoute;
|
||||||
|
}
|
||||||
|
for (Map.Entry<String, ZuulTargetRoute> 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
|
@Override
|
||||||
|
@@ -95,7 +95,7 @@ public class ApiMetaBuilder {
|
|||||||
if (path.contains("$") || isIgnorePattern(path)) {
|
if (path.contains("$") || isIgnorePattern(path)) {
|
||||||
return null;
|
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.setIgnoreValidate(BooleanUtils.toInteger(true));
|
||||||
apiMeta.setMergeResult(BooleanUtils.toInteger(false));
|
apiMeta.setMergeResult(BooleanUtils.toInteger(false));
|
||||||
apiMeta.setPermission(BooleanUtils.toInteger(false));
|
apiMeta.setPermission(BooleanUtils.toInteger(false));
|
||||||
|
@@ -2,6 +2,7 @@ package com.gitee.sop.storyweb.controller;
|
|||||||
|
|
||||||
import com.gitee.sop.servercommon.util.UploadUtil;
|
import com.gitee.sop.servercommon.util.UploadUtil;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
@@ -14,6 +15,7 @@ import java.util.Collection;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 传统web开发实例
|
* 传统web开发实例
|
||||||
|
*
|
||||||
* @author tanghc
|
* @author tanghc
|
||||||
*/
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
@@ -72,6 +74,15 @@ public class TraditionalWebappController {
|
|||||||
return food;
|
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
|
@Data
|
||||||
public static class Food {
|
public static class Food {
|
||||||
private Integer id;
|
private Integer id;
|
||||||
|
@@ -19,13 +19,13 @@ import java.io.IOException;
|
|||||||
@WebServlet(urlPatterns = "/rest/*")
|
@WebServlet(urlPatterns = "/rest/*")
|
||||||
public class RestServlet extends HttpServlet {
|
public class RestServlet extends HttpServlet {
|
||||||
|
|
||||||
private static final String REST_PATH = "/rest";
|
private static final String EMPTY_VERSION = "";
|
||||||
|
|
||||||
@Value("${zuul.servlet-path:/zuul}")
|
@Value("${zuul.servlet-path:/zuul}")
|
||||||
private String path;
|
private String path;
|
||||||
|
|
||||||
@Value("${zuul.rest-default-version:1.0}")
|
@Value("${sop.restful.path:/rest}")
|
||||||
private String defaultVersion;
|
private String restPath;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
||||||
@@ -35,16 +35,11 @@ public class RestServlet extends HttpServlet {
|
|||||||
@Override
|
@Override
|
||||||
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
||||||
String url = request.getRequestURL().toString();
|
String url = request.getRequestURL().toString();
|
||||||
int index = url.indexOf(REST_PATH);
|
int index = url.indexOf(restPath);
|
||||||
// 取/rest的后面部分
|
// 取/rest的后面部分
|
||||||
String path = url.substring(index + REST_PATH.length());
|
String path = url.substring(index + restPath.length());
|
||||||
String method = path;
|
request.setAttribute(SopConstants.REDIRECT_METHOD_KEY, path);
|
||||||
String version = request.getParameter(ParamNames.VERSION_NAME);
|
request.setAttribute(SopConstants.REDIRECT_VERSION_KEY, EMPTY_VERSION);
|
||||||
if (version == null) {
|
|
||||||
version = defaultVersion;
|
|
||||||
}
|
|
||||||
request.setAttribute(SopConstants.REDIRECT_METHOD_KEY, method);
|
|
||||||
request.setAttribute(SopConstants.REDIRECT_VERSION_KEY, version);
|
|
||||||
request.getRequestDispatcher(this.path).forward(request, response);
|
request.getRequestDispatcher(this.path).forward(request, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user