У меня есть приложение 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>