diff --git a/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java b/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java index e1bb63f86a..b52e970988 100644 --- a/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java +++ b/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java @@ -55,6 +55,7 @@ import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageNotWritableException; import org.springframework.util.ClassUtils; +import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; import org.springframework.validation.BindingResult; import org.springframework.web.HttpMediaTypeNotAcceptableException; @@ -133,6 +134,7 @@ *

* * @author Dave Syer + * @author Stefan Berger * */ public class ProxyExchange { @@ -251,11 +253,23 @@ public ProxyExchange uri(String uri) { } } + /** + * Returns the request path without any query parameters. + * @return the URI path + * @see ProxyExchange#path(String) + * @see ProxyExchange#queryParams + */ public String path() { - return (String) this.webRequest.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, - WebRequest.SCOPE_REQUEST); + return exchange.getRequest().getPath().pathWithinApplication().value(); } + /** + * Returns the request path without the provided path prefix and without any query parameters. + * @param prefix the path prefix to remove + * @return the URI path + * @see ProxyExchange#path(String) + * @see ProxyExchange#queryParams + */ public String path(String prefix) { String path = path(); if (!path.startsWith(prefix)) { @@ -264,6 +278,14 @@ public String path(String prefix) { return path.substring(prefix.length()); } + /** + * Returns the original query parameters. + * @return the query parameters + */ + public MultiValueMap queryParams() { + return exchange.getRequest().getQueryParams(); + } + public void forward(String path) { HttpServletRequest request = this.webRequest.getNativeRequest(HttpServletRequest.class); HttpServletResponse response = this.webRequest.getNativeResponse(HttpServletResponse.class); diff --git a/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java b/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java index 62cb7f0721..113abbc5b0 100644 --- a/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java +++ b/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java @@ -38,6 +38,7 @@ import org.springframework.http.RequestEntity.BodyBuilder; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestBody; @@ -107,6 +108,7 @@ *

* * @author Dave Syer + * @author Stefan Berger * */ public class ProxyExchange { @@ -229,10 +231,23 @@ public ProxyExchange uri(String uri) { return this; } + /** + * Returns the request path without any query parameters. + * @return the URI path + * @see ProxyExchange#path(String) + * @see ProxyExchange#queryParams + */ public String path() { return exchange.getRequest().getPath().pathWithinApplication().value(); } + /** + * Returns the request path without the provided path prefix and without any query parameters. + * @param prefix the path prefix to remove + * @return the URI path + * @see ProxyExchange#path(String) + * @see ProxyExchange#queryParams + */ public String path(String prefix) { String path = path(); if (!path.startsWith(prefix)) { @@ -241,6 +256,14 @@ public String path(String prefix) { return path.substring(prefix.length()); } + /** + * Returns the original query parameters. + * @return the query parameters + */ + public MultiValueMap queryParams() { + return exchange.getRequest().getQueryParams(); + } + public Mono> get() { RequestEntity requestEntity = headers((BodyBuilder) RequestEntity.get(uri)).build(); return exchange(requestEntity);