gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:27:04 24 4
gpt4 key购买 nike

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

我的问题是:客户端是否需要对百分比符号进行双重编码(例如发送 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 命令:

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

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

Apr 2, 2012 5:15:20 PM org.restlet.ext.jaxrs.internal.util.ExceptionHandler methodInvokeException WARNING: Can not invoke the resource method java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: " 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)    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)    at 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>

最佳答案

我知道这是一个很老的问题,但这个问题今天仍然存在于 ReSTLet 的 JAX-RS 实现中。这绝对是一个错误,所以我已经用 ReSTLet 正式化了一个错误报告。希望它能在即将发布的版本中得到修复!

此处包含所有相关实现细节的错误报告:

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

关于java - RESTlet 似乎在双重解码我的表单参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9985892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com