10

在测试中使用 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 进行编码。

这是来自日志(字符串已再次被 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]

谢谢。

4

2 回答 2

12

对我有用的是MockMvcRequestBuilders.get(new URI([ENCODED_URL_STRING])).

我想有替代使用MockMvcRequestBuilders.get(String urlTemplate, Object... urlVariables),适当的 urlVariables,但我没有更深入。

于 2016-04-03T19:06:27.863 回答
1

有点晚了,但我创建了自己的 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))/**/

这不是一个完美的解决方案,但由于缺乏其他解决方案,它可以工作......

于 2015-06-08T10:58:47.447 回答