Java RESTlet似乎在双重解码我的表单参数

Java RESTlet似乎在双重解码我的表单参数,java,restlet,form-parameter,Java,Restlet,Form Parameter,我在Tomcat服务器中嵌入了一个RESTlet应用程序,客户端抱怨@FormParm参数中的%符号在RESTlet框架中被双重解码,导致服务器错误500 我的问题是: 客户端是否需要对百分比符号进行双重编码(例如,发送xx%2525xx以表示五字符序列“xx%xx”)? 如果是这样,这是RESTlet框架中的一个bug,还是编码表单参数的常见方式? 如果没有,我如何滥用RESTlet框架 我的API看起来像 //... many imports omitted. import javax.ws

我在Tomcat服务器中嵌入了一个RESTlet应用程序,客户端抱怨@FormParm参数中的%符号在RESTlet框架中被双重解码,导致服务器错误500

我的问题是: 客户端是否需要对百分比符号进行双重编码(例如,发送xx%2525xx以表示五字符序列“xx%xx”)? 如果是这样,这是RESTlet框架中的一个bug,还是编码表单参数的常见方式? 如果没有,我如何滥用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+工作”http://${host}/api/sessionx21/foo/home/

生成如下所示的服务器端堆栈跟踪:

2012年4月2日下午5:15:20 org.restlet.ext.jaxrs.internal.util.ExceptionHandler MethodInvokeeException 警告:无法调用资源方法 java.lang.IllegalArgumentException:URLDecoder:转义(%)模式中的非法十六进制字符-用于输入字符串:“w” 在java.net.urldecover.decode(urldecover.java:173) 位于org.restlet.data.Reference.decode(Reference.java:170) 位于org.restlet.data.Reference.decode(Reference.java:143) 位于org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList$AbstractParamGetter.convertParamValue(ParameterList.java:186) 位于org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList$AbstractParamGetter.convertParamValue(ParameterList.java:166) 位于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) 位于org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList$AbstractParamGetter.getValue(ParameterList.java:409) 位于org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList.get(ParameterList.java:1096) 位于org.restlet.ext.jaxrs.internal.wrappers.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>

maven restlet
公共在线Restlet存储库
http://maven.restlet.org
....
2.1

我知道这个问题很久以前就贴出来了,但也许有人会发现它仍然有用。 我今天也有同样的问题

在挖掘restlet代码之后,似乎有一个错误,url对参数进行了两次解码。 解决方法是使用注释方法。此注释标记不解码参数,因此仅解码一次

@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 ....
 }

我知道这个问题很久以前就贴出来了,但也许有人会发现它仍然有用。 我今天也有同样的问题

在挖掘restlet代码之后,似乎有一个错误,url对参数进行了两次解码。 解决方法是使用注释方法。此注释标记不解码参数,因此仅解码一次

@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 ....
 }

我也遇到了这个错误。我的解决方案是将pom依赖项从restlet ext jaxrs 2.0.9更改为restlet ext jaxrs 2.0.9-snapshot。这两个jar文件的不同之处在于ParameterList类的AbstractParamGetter方法。前者有外部代码段:

  if(decode() && paramValue != null)
            paramValue = Reference.decode(paramValue);

我也遇到了这个错误。我的解决方案是将pom依赖项从restlet ext jaxrs 2.0.9更改为restlet ext jaxrs 2.0.9-snapshot。这两个jar文件的不同之处在于ParameterList类的AbstractParamGetter方法。前者有外部代码段:

  if(decode() && paramValue != null)
            paramValue = Reference.decode(paramValue);

我知道这是一个非常古老的问题,但这个问题在Restlet的JAX-RS实现中仍然存在。这肯定是一个bug,所以我已经用Restlet形式化了一个bug报告。希望它能在即将发布的版本中得到修复

错误报告及所有相关实施细节如下:


我知道这是一个非常老的问题,但这个问题在Restlet的JAX-RS实现中仍然存在。这肯定是一个bug,所以我已经用Restlet形式化了一个bug报告。希望它能在即将发布的版本中得到修复

错误报告及所有相关实施细节如下: