Tomcat 2.0.27 で Jersey 1.19 を介して REST サービスを作成する場合、@PathParams でスペースを使用できますか?
ファイル名パス パラメータにスペースを指定して REST サービスを呼び出そうとすると、Jersey は 400 Bad Request を返します。私のコードにも届きません。ファイル名にスペースがない場合、すべてが期待どおりに機能しています。私の REST メソッドの注釈は次のとおりです。
@GET
@Path("/trennblatt/{objId}/{filename}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getTrennblatt(
@PathParam("objId") final long objId,
@PathParam("filename") final String filename,
@Context final HttpServletResponse response)
Tomcat のアクセス ログ、エンコーディングは問題ないようです:
[18/Apr/2016:11:09:17 +0200] "GET /.../trennblatt/228342/01%20Aktendecke.pdf HTTP/1.1" 400 1004
[18/Apr/2016:11:09:29 +0200] "GET /.../trennblatt/228342/inspectionsheet.html HTTP/1.1" 200 44870
[18/Apr/2016:11:13:29 +0200] "GET /.../trennblatt/228342/inspectionsheet.html/ HTTP/1.1" 200 44870
[18/Apr/2016:11:13:33 +0200] "GET /.../trennblatt/228342/01%20Aktendecke.pdf/ HTTP/1.1" 400 1004
アクセスログが示すように、別の / を URI テンプレートに追加しようとしても成功しませんでした。
@Path("/trennblatt/{objId}/{filename}/")
ファイル名(すべて)の文字セットも指定してみました:
@Path("/trennblatt/{objId}/{filename:.+}")
以下を追加して、Jersey ロギングを有効にしようとしました。
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
</init-param>
しかし、追加の出力が見つかりませんでした。「log」または「out」を含むアクセスされたファイルに対しても procmon を実行しました。
「ジャージ レスト スペース @PathParam」などをグーグルで検索すると、「@PathParam でスラッシュとドットを有効にするにはどうすればよいですか」などの楽しい情報が返されます。これがどのように問題になるかがわかります。しかし、 @PathParam の単純な (そして適切にエンコードされた) スペースが機能するかどうかについて、明確な声明を見つけることができませんでした。
@QueryParam を使用しているときは、すべて問題ありません。
@GET
@Path("/trennblatt")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getTrennblatt(
@QueryParam("objId") final long objId,
@QueryParam("filename") final String filename,
@Context final HttpServletResponse response)
[18/Apr/2016:11:17:47 +0200] "GET /.../trennblatt?objId=228342&filename=inspectionsheet.html HTTP/1.1" 200 44870
[18/Apr/2016:11:18:04 +0200] "GET /.../trennblatt?objId=228342&filename=01%20Aktendecke.pdf HTTP/1.1" 200 45081
これは私の現在の回避策ですが、@PathParam を使用するポイントがあります (可能な限り WebDAV サービスと同様に保ちます)。ですから、これについてあなたの意見をお聞きしたいと思います。ありがとう!