I eine Restlet Anwendung in einem Tomcat Server eingebettet haben, und Clients, die Symbole in% @FormParm Parameter beklagen sind doppelt im Restlet Rahmen verursacht einen Serverfehler 500.Restlet erscheint doppelt Decodierung meine Form Parameter zu sein
dekodierten Meine Fragen sind: Müssen die Kunden Prozentzeichen doppelt kodieren (zB senden xx% 2525xx, um die fünf Zeichenfolge "xx% xx" darzustellen)? Wenn dies der Fall ist, ist dies ein Fehler im RESTlet-Framework oder die übliche Methode zum Codieren von Formularparametern? Wenn nicht, wie missbrauche ich das RESTlet-Framework?
Meine API sieht aus wie
//... 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 ....
}
Ein curl Befehl wie:
curl -H "Accept: application/json" -d "name = 100% 25 + arbeiten" http:// $ {host}/api/sessionx21/foo/home/
Erzeugt einen Stack-Trace-Server-Seite, die wie folgt aussieht:
2. April 2012 05.15.20 org.restlet.ext.jaxrs.internal.util.ExceptionHandler methodInvokeException WARNUNG: Kann nicht die Ressource Methode java.lang.IllegalArgumentException aufrufen: URLDecoder: Illegale Hex-Zeichen in Flucht (%) pattern - Für Eingabezeichenfolge: "w" bei java.net.URLDecoder.decode (URLDecoder.java:173) bei org.restlet.data.Reference.decode (Reference.java:170) bei org. resetlet.data.Reference.decode (Reference.java:143) bei org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList $ AbstractParamGetter.convertParamValue (ParameterList.java:186) bei org.restlet.ext. jaxrs.internal.wrappers.params.ParameterList $ AbstractParamGetter.convertParamValue (ParameterList.java:166) bei org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList $ FormOrQueryParamGetter.getParamValue (ParameterList.java:529) bei org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList $ FormParamGetter.getParamValue (ParameterList.java:561) bei org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList $ AbstractParamGetter.getValue (ParameterList.java:409) bei org.restlet.ext.jaxrs.internal.wrappers.params. ParameterList.get (ParameterList.java:1096) bei org.restlet.ext.jaxrs.internal.wrappers.AbstractMethodWrapper.internalInvoke (AbstractMethodWrapper.java:166)
Meine pom.xml-Datei enthält
<repository>
<id>maven-restlet</id>
<name>Public online Restlet repository</name>
<url>http://maven.restlet.org</url>
</repository>
....
<jaxb.version>2.1</jaxb.version>