2012-04-03 1 views
2

У меня есть приложение Restlet встроенного в сервере Tomcat и клиенты жалуются на то, что символы% в параметрах @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 .... 
    } 

завиток команда, как:

локон -H "Accept: приложения/JSON" -d "имя = 100% 25 + работает" HTTP:// $ {хост}/API/sessionx21/Foo/дома/

Создает трассировку стека на стороне сервера, который выглядит как:

2 апреля 2012 г. 5:15:20 org.restlet.ext.jaxrs.internal.util.ExceptionHandler methodInvokeException ВНИМАНИЕ: Невозможно вызвать метод ресурса java.lang.IllegalArgumentException: URLDecoder: Незаконные шестнадцатеричные символы в escape-последовательности (%) - для строки ввода: «w» на java.net.URLDecoder.decode (URLDecoder.java:173) на 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) на 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) в 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

Я знаю этот вопрос давно, но, возможно, кто-то все равно найдет его полезным. У меня была такая же проблема сегодня.

После того, как выкопали код рестарта - кажется, что есть ошибка в расшифровке 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 решение изменяется зависимость POM от Restlet-Ext-jaxrs 2.0.9 для Restlet-Ext-jaxrs 2.0.9-snapshot.the различию этих двух файлов JAR это метод ParameterList 'AbstractParamGetter.Бывший один имеет внешний фрагмент кода:

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

Я знаю, что это очень старый вопрос, но вопрос до сих пор существует в реализации RS-JAX Restlet сегодня. Это определенно ошибка, поэтому я формализовал отчет об ошибке с помощью Restlet. Здесь нужно надеяться, что это будет исправлено в предстоящем выпуске!

Отчет об ошибке со всеми соответствующими деталями реализации здесь:

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