繁体   English   中英

spring 4.1.1,mockmvc并且不希望HTTP GET请求的url编码

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM