0

在我的 Rest API 中,应该可以检索边界框内的数据。因为边界框有四个坐标,所以我想以这样的方式设计 GET 请求,即它们接受边界框作为 JSON。因此,我需要能够将 JSON 字符串作为 URL 参数发送和记录。

测试本身有效,但我无法使用 Spring RestDocs (1.0.0.RC1) 记录这些请求。我用更简单的方法重现了这个问题。见下文:

  @Test public void ping_username() throws Exception
  {
    String query = "name={\"user\":\"Müller\"}";
    String encodedQuery = URLEncoder.encode(query, "UTF-8");
    mockMvc.perform(get(URI.create("/ping?" + encodedQuery)))
            .andExpect(status().isOk())
            .andDo(document("ping_username"));
  }

当我删除.andDo(document("ping_username"))测试通过时。

堆栈跟踪:

java.lang.IllegalArgumentException: Illegal character in query at index 32: http://localhost:8080/ping?name={"user":"Müller"}
    at java.net.URI.create(URI.java:852)
    at org.springframework.restdocs.mockmvc.MockMvcOperationRequestFactory.createOperationRequest(MockMvcOperationRequestFactory.java:79)
    at org.springframework.restdocs.mockmvc.RestDocumentationResultHandler.handle(RestDocumentationResultHandler.java:93)
    at org.springframework.test.web.servlet.MockMvc$1.andDo(MockMvc.java:158)
    at application.rest.RestApiTest.ping_username(RestApiTest.java:65)

在收到对 URL 进行编码的建议后,我尝试了它,但问题仍然存在。

在我的测试中用于创建 URI 的字符串是 now /ping?name%3D%7B%22user%22%3A%22M%C3%BCller%22%7D

我检查了MockMvcOperationRequestFactory堆栈跟踪中出现的类,并在第 79 行执行了以下代码:

URI.create(getRequestUri(mockRequest)
                + (StringUtils.hasText(queryString) ? "?" + queryString : ""))

这里的问题是使用了未编码的字符串(在我的情况下http://localhost:8080/ping?name={"user":"Müller"})并且创建 URI 失败。

评论:

安迪威尔金森的答案是解决问题的方法。尽管我认为 David Sinfield 是对的,并且应该避免在 URL 中使用 JSON 以保持简单。对于我的边界框,我将使用逗号分隔的字符串,因为它在WMS 1.1中使用:BBOX=x1,y1,x2,y2

4

2 回答 2

1

您没有提到您正在使用的 Spring REST Docs 版本,但我猜问题出在URIUtil. 我无法确定,因为我看不到URIUtil来自哪里。

URLEncoder无论如何,在Spring REST Docs 1.0.0.RC1中使用 JDK为我工作:

String query = "name={\"user\":\"Müller\"}";
String encodedQuery = URLEncoder.encode(query, "UTF-8");
mockMvc.perform(get(URI.create("/baz?" + encodedQuery)))
        .andExpect(status().isOk())
        .andDo(document("ping_username"));

然后,您可以URLDecoder.decode在服务器端使用来获取原始 JSON:

URLDecoder.decode(request.getQueryString(), "UTF-8")
于 2015-10-01T14:21:02.447 回答
1

问题是 URI 必须编码为 ACII。并且ü不是有效的 ASCII 字符,所以必须在 url 中使用转义进行%转义。

如果您使用的是 Tomcat,您可以URIEncoding="UTF-8"在 , 的Connector元素中使用server.xml,将 UTF-8 转义配置为默认值。如果这样做,ü将自动转换为%C3%BC,这是\uC3BCUnicode 代码点(表示ü)的 ASCII 表示。


编辑:似乎我错过了错误的确切点,但它仍然是同一个错误。URI 中的大括号无效。根据 RFC 3986,仅可接受以下字符:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=%

所以这些也必须逃脱。

于 2015-10-01T10:45:40.357 回答