我有嵌入到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>