0

私の 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

4

2 に答える 2

1

問題は、URI を ACII としてエンコードする必要があることです。Andüは有効な ASCII 文字ではないため、エスケープを使用して URL で%エスケープする必要があります。

Tomcat を使用している場合は、 の要素で を使用URIEncoding="UTF-8"して、UTF-8 エスケープをデフォルトとして構成できます。これを行うと、は自動的に に変換されます。これは、 Unicode コードポイント ( を表す)の ASCII 表現です。Connectorserver.xmlü%C3%BC\uC3BCü


編集:エラーの正確なポイントを見逃したようですが、それでも同じエラーです。URI では中かっこは無効です。RFC 3986 に従って、次の文字のみが受け入れられます。

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

したがって、これらもエスケープする必要があります。

于 2015-10-01T10:45:40.357 に答える
1

使用している Spring REST Docs のバージョンについて言及していませんが、問題はURIUtil. どこから来たのか見えないので、はっきりとは言えませんURIUtil

とにかく、URLEncoderSpring 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 に答える