13

パス内の一連のパラメーターpathparametersを受け取るjax-rsサービスがあります。これらのパラメータは、URLに適さない値を含む文字列である可能性があるため、次のようにjava.net.UrlEncoderを使用してクライアント側でurlencodedされます。

String param = URLEncoder.encode(o.toString(), "UTF-8");

これは、URLを作成するために使用されsupplier/group/param1/param2/param3ます。urlencodingが原因でこれらのいずれかが変更された場合、たとえばスペースのみの場合、サービスで受信される文字列は+符号です。

@GET
@Path("{supplierId}/{groupCode}/{groupId}")
@Produces({MediaType.APPLICATION_XML, MediaType.TEXT_XML})
public SupplierGroup getSupplierGroup(@PathParam("supplierId") BigDecimal supplierId,
        @PathParam("groupCode") String groupCode,
        @PathParam("groupId") BigDecimal groupId) {
    //now groupCode is "+", not " "
}

jaxrsがエンコードされたパスパラメータを自動的にデコードすることを期待します。

編集:もう少しテストし%20て、スペースに使用して送信すると、パラメータをデコードできることを発見しました。

4

2 に答える 2

15

pathparamsの自動エンコーディングは期待どおりに機能します。問題は%20、URL自体のスペースをエンコードするために+使用され、クエリ文字列(?の後の部分)をエンコードするために使用されることでした。Pathparamsは実際にはURLの一部であるため、%20を使用する必要があります。

URI.toAsciiString()代わりに使用しUrlEncoder.encode(...)てさまざまな部分を渡すと、正しくデコードされた有効なURLが得られます。

于 2012-12-03T13:22:39.447 に答える
3

PathParam javadocからの引用:

Encodedアノテーションを使用して無効にしない限り、値はURLデコードされます。

于 2012-11-29T18:35:52.423 に答える