2

私はTomcatサーバーにRESTletアプリケーションを組み込んでいますが、クライアントは@FormParmパラメーターの%シンボルがRESTletフレームワークで二重にデコードされてサーバーエラー500を引き起こしていると不平を言っています。

私の質問は次のとおりです。クライアントはパーセント記号を二重にエンコードする必要がありますか(たとえば、5文字のシーケンス「xx%xx」を表すためにxx%2525xxを送信します)?もしそうなら、これはRESTletフレームワークのバグですか、それともフォームパラメータをエンコードする一般的な方法ですか?そうでない場合、RESTletフレームワークをどのように誤用していますか?

私のAPIは次のようになります

//... many imports omitted.
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.HttpHeaders;

@Path("/{session}/foo/")
@Transactional(propagation = Propagation.REQUIRED)

 /**  ........
  */
public class DocumentService extends BaseService {
// ...
     */
  @POST
  @Path("/{path:.*}/")
  @Consumes({"application/x-www-form-urlencoded"})
  @Produces({"application/json"})
  public Response alterDocument(final @Context UriInfo ui, 
    final @Context HttpHeaders hh,
    final @PathParam("session") String sessionToken,
    final @PathParam("path") String path,
    @FormParam("name") String name) throws WebApplicationException {
      /// code here not reached on call described below ....
    }

次のようなcurlコマンド:

curl -H "Accept:application / json" -d "name = 100%25 + working" http:// $ {host} / api / sessionx21 / foo / home /

次のようなサーバー側のスタックトレースを生成します。

2012年4月2日17:15:20org.restlet.ext.jaxrs.internal.util.ExceptionHandlermethodInvokeException警告:リソースメソッドjava.lang.IllegalArgumentExceptionを呼び出すことができません:URLDecoder:エスケープ(%)パターンの不正な16進文字-入力文字列の場合:「w」at java.net.URLDecoder.decode(URLDecoder.java:173)at org.restlet.data.Reference.decode(Reference.java:170)at org.restlet.data.Reference.decode( Reference.java:143)at org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList $ AbstractParamGetter.convertParamValue(ParameterList.java:186)at org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList $ AbstractParamGetter.convertParamValue(ParameterList.java:166)at org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList $ FormOrQueryParamGetter.getParamValue(ParameterList.java:529)org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList $ FormParamGetter.getParamValue(ParameterList.java:561)at org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList $ AbstractParamGetter.getValue( ParameterList.java:409)at org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList.get(ParameterList.java:1096)at org.restlet.ext.jaxrs.internal.wrappers.AbstractMethodWrapper.internalInvoke(AbstractMethodWrapper。 java:166)AbstractMethodWrapper.internalInvoke(AbstractMethodWrapper.java:166)AbstractMethodWrapper.internalInvoke(AbstractMethodWrapper.java:166)

私のpom.xmlファイルには

    <repository>
      <id>maven-restlet</id>
      <name>Public online Restlet repository</name>
      <url>http://maven.restlet.org</url>
    </repository>
....
       <jaxb.version>2.1</jaxb.version>
4

3 に答える 3

2

これは非常に古い質問ですが、この問題は現在でもRestletのJAX-RS実装に存在します。間違いなくバグなので、Restletでバグレポートを作成しました。今後のリリースで修正されることを願っています。

関連するすべての実装の詳細を含むバグレポートは次のとおりです。

http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4375&dsMessageId=3091010

于 2014-11-08T21:35:47.143 に答える
1

私はこの質問がずっと前に投稿されたことを知っています、しかし多分誰かがそれがまだ役に立つと思うでしょう。今日も同じ問題がありました。

レストレットコードを掘り下げた後、パラメータを2回URLデコードするバグがあるようです。この回避策は、メソッドに@Encodedでアノテーションを付けることです。この注釈はパラメータをデコードしないようにマークしているため、一度だけデコードされます。

@POST
@Path("/{path:.*}/")
@Encoded
@Consumes({"application/x-www-form-urlencoded"})
@Produces({"application/json"})
public Response alterDocument(final @Context UriInfo ui, 
  final @Context HttpHeaders hh,
  final @PathParam("session") String sessionToken,
  final @PathParam("path") String path,
  @FormParam("name") String name) throws WebApplicationException {
    /// code here not reached on call described below ....
 }
于 2012-08-14T09:44:49.630 に答える
1

私はこのバグに遭遇しました。私のソリューションはpomの依存関係をrestlet-ext-jaxrs2.0.9からrestlet-ext-jaxrs2.0.9-snapshotに変更しました。これら2つのjarファイルの違いはParameterListクラスのAbstractParamGetterメソッドです。 。前者には外部コードスニペットがあります:</ p>

  if(decode() && paramValue != null)
            paramValue = Reference.decode(paramValue);
于 2013-03-14T02:51:53.777 に答える