私の Rest API では、境界ボックス内にあるデータを取得できるはずです。境界ボックスには 4 つの座標があるため、境界ボックスを JSON として受け入れるように GET 要求を設計したいと考えています。したがって、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を作成するために使用される文字列は現在/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 の作成が失敗することです。
述べる:
Andy Wilkinson の答えは、この問題の解決策です。David Sinfield は正しいと思いますが、URL をシンプルに保つために JSON は避けるべきです。私のバウンディング ボックスでは、WMS 1.1で使用されているように、カンマ区切りの文字列を使用します。BBOX=x1,y1,x2,y2