[英]spring 4.1.1, mockmvc and do not want url encoding of HTTP GET request
在测试中使用MockMVC,我需要测试已经URL编码的GET URL:
http://host:port/app/controller/[ALREADY URL ENCODED]
编码:
mockmvc.perform(get("/controller/[ALREADY URL ENCODED]")
但是在日志中我看到URL在到达适当的控制器方法之前已经被再次进行了url编码。 有没有办法可以阻止spring mockmvc进行url编码? 也许在测试中禁用url编码?
“[ALREADY URL ENCODED]”字符串的真实示例:
MEUwQzBBMD8wPTAJBgUrDgMCGgUABBQ%2Fm36Fj2BE19VBYXRO62zrgIYp0gQVAQazEyvlq22wsMBkRyAeaUiZ%2BhTUAgMGJbQ%3D
这会在控制器看到之前再次对URL进行编码。
这是来自日志(该字符串已被重新编码)
xxxxx [main] DEBUG [o.s.t.w.s.TestDispatcherServlet] DispatcherServlet with name '' processing GET request for [/app/controller/MEUwQzBBMD8wPTAJBgUrDgMCGgUABBQ%252Fm36Fj2BE19VBYXRO62zrgIYp0gQVAQazEyvlq22wsMBkRyAeaUiZ%252BhTUAgMGJbQ%253D]
请注意,如果我使用CURL调用,则spring框架不会执行url编码,并且控制器会获取发送的内容。 但是,mockmvc会在进入适当的控制器方法之前进行编码。
curl -X GET http:host:port/app/controller/[ALREADY URL ENCODED]
谢谢。
对我MockMvcRequestBuilders.get(new URI([ENCODED_URL_STRING]))
是MockMvcRequestBuilders.get(new URI([ENCODED_URL_STRING]))
。
我猜有其他方法可以使用MockMvcRequestBuilders.get(String urlTemplate, Object... urlVariables)
和适当的urlVariables,但我没有更深入。
有点晚了,但我创建了自己的URI匹配器与MockMvc一起使用:
public class RequestToUriMatcher implements RequestMatcher {
private final String expectedUri;
public RequestToUriMatcher(String expectedUri){
this.expectedUri = expectedUri;
}
@Override
public void match(ClientHttpRequest clientHttpRequest) throws IOException, AssertionError {
URI requestUri = clientHttpRequest.getURI();
//requestUri is encoded, so if request was made with query parameter already encoded, this would be double-encoded, so decoding it once here
String decodedUri = URLDecoder.decode(requestUri.toString(), "UTF-8");
assertTrue(decodedUri.endsWith(expectedUri));
}
}
其次是静态方法:
public static RequestMatcher requestToUri(String uri){
return new RequestToUriMatcher(uri);
}
现在我可以像这样使用它:
String uri = "stuff%3Dvalue";
MockRestServiceServer.createServer(restTemplate)
.expect(requestToUri(uri))/**/
它不是一个完美的解决方案,但为了缺乏其他解决方案,它的工作原理......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.