2012-04-03 46 views
2

我有嵌入到Tomcat服务器一个应用程序的Restlet和客户都在抱怨在@FormParm参数%符号Restlet框架的双重解码导致了服务器错误500的Restlet似乎是双解码我的表格参数

我的问题是: 客户端是否需要对百分比符号进行双重编码(例如,发送xx%2525xx来表示五个字符序列“xx%xx”)? 如果是这样,这是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命令,如:

卷曲-H “接受:应用/ JSON的” -d “NAME = 100%25 +工作” 的http://$ {HOST}/API/sessionx21 /富/家庭/

生成一个服务器端的堆栈跟踪,看起来像:

2012年4月2日下午5:15:20 org.restlet.ext.jaxrs.internal.util.ExceptionHandler methodInvokeException 警告:无法调用资源方法 java.lang.IllegalArgumentException:URLDecoder:转义中的非法十六进制字符(%)模式 - 对于输入字符串:“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) 在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) at org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList $ FormOrQueryParamGetter.getParamValue(ParameterList.java:529) at 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) 在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> 

回答

1

我知道很久以前发布这个问题,但也许有人仍然会觉得它有用。 今天我有同样的问题。

挖掘restlet代码后 - 似乎有一个错误的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 .... 
} 
1

我碰上此错误,too.my溶液从的Restlet-EXT-JAXRS 2.0.9改变了POM依赖性的Restlet-EXT-JAXRS这两个jar文件的2.0.9-snapshot.the性差异是ParameterList类的AbstractParamGetter方法。前者有外部的代码片段:

if(decode() && paramValue != null) 
      paramValue = Reference.decode(paramValue); 
相关问题