2012-04-03 9 views
2

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> 

Antwort

1

Ich weiß diese Frage geschrieben vor langer Zeit, aber vielleicht wird jemand es immer noch nützlich finden. Ich hatte heute das gleiche Problem.

Nach dem Graben des Restlet-Codes - es scheint, als gäbe es einen Fehler der URL-Decodierung der Parameter zweimal. Problemumgehung dafür ist, die Methode mit @Encoded zu kommentieren. Dieses Anmerkungszeichen entschlüsselt die Parameter nicht, so dass es nur einmal dekodiert wird.

@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

i laufen in diesen Fehler wird too.my Lösung die pom Abhängigkeit von Restlet-ext-jaxrs 2.0.9 Restlet-ext-jaxrs 2.0.9-snapshot.the diference dieser beiden JAR-Datei geändert ist die AbstractParamGetter-Methode der ParameterList-Klasse.Der erstere hat den externen Code-Schnipsel:

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

Ich weiß, dass dies eine sehr alte Frage, aber das Problem besteht nach wie vor in Restlet der JAX-RS Implementierung heute. Es ist definitiv ein Fehler, also habe ich einen Fehlerbericht mit Restlet formalisiert. Hier ist zu hoffen, dass es in einer kommenden Version behoben wird!

Fehlerbericht mit allen relevanten Details der Implementierung hier:

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