2011-05-23 20 views
26

No estoy usando JSON ni nada de eso. Tengo un formulario simple para subir un archivo y quiero leer los parámetros del formulario. El código a continuación no está funcionando como se esperaba. No mostrará ningún parámetro.¿Cómo leo los parámetros de POST para un servicio RESTful usando Jersey?

@POST 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
@Path("{appNum}/{docId}/file") 
public Response uploadDocFile(
     @PathParam("appNum") String appNum, 
     @PathParam("docId") String docId, 
     @Context HttpServletRequest req) 
{ 

    try { 

     log.info("POST Parameters:"); 

     Enumeration e = req.getParameterNames(); 

     while(e.hasMoreElements()) 
     { 
      Object key = e.nextElement(); 
      log.info("Key: " + key); 
      log.info("Val: " + req.getParameter(key.toString())); 
     } 


    } catch (Exception e) { 
     e.printStackTrace(); 
     return Response.status(Status.INTERNAL_SERVER_ERROR).entity(new StatusResponse(e)).build(); 
    } 

    return Response.ok().build(); 
} 
+0

El formulario es un formulario HTML normal, sé que este código es correcto: –

+1

son los parametros presentados (comprobar con firebug) – Bozho

+0

sí, he verificado con wireshark –

Respuesta

23

FYI, Necesitas utilizar @FormParam. También asegúrese de que los tipos HTML de INPUT estén usando name = not id =.

+0

He reproducido el problema en mi máquina. Debería poder acceder a HttpServletRequest (según http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e522) y no sé por qué no puedo hacerlo. He probado varios contenedores de servlets, así que me gustaría saber si alguien sabe por qué sucede esto. – stand

+0

Desde que aterricé aquí cuando busqué en Google. Encontré que esto funciona 'Respuesta pública doSomething (@Context HttpContext context)'. A continuación, puede obtener la solicitud con los parámetros de 'context'. – sunn0

19

Tengo el mismo problema. El uso de la anotación @FormParam para parámetros individuales funciona, pero leerlos de HttpServletRequest inyectado a través de @Context no lo hace. También traté de obtener los objetos/parámetros de solicitud a través de Guice usando Provider<HttpServletRequest> y @RequestParameters<Map<String, String[]>>. En ambos casos, no hubo parámetros de publicación.

Sin embargo, es posible obtener un mapa de parámetros agregando un parámetro MultivaluedMap<String, String> al método de recurso. Ejemplo:

@POST 
public void doSomething(MultivaluedMap<String, String> formParams) { 
//... 
} 
2

En algún punto del tiempo Jersey ContainerServlet (u otro objeto Jersey durante el procesamiento de la solicitud) llama request.getInputStream() o request.getReader() que establece 'usingInputStream' o 'usingReader' a TRUE. Este estado evita que se llene el mapa de parámetros dentro del objeto de solicitud. Algo como esto:

parseParameters() { 
    if (usingInputStream || usingReader) { 
     return; 
    } else { 
     parametersMap.putAll({actual parameters parsing from stream}) 
    } 
} 

Map getParametersMap() { 
    return parametersMap; 
} 

trate de poner un punto de quiebre en el primer punto de entrada (comienzo del método Jersey ServletContainer.service()) de su aplicación y evaluar llamada request.getParametersMap(). Obtendrás tus parámetros.

5

Si está utilizando Jersey RESTful API en JAVA se puede buscar Parameter Annotations (@*Param)

Ejemplo:

Dependencia:

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-client</artifactId> 
    <version>1.8</version> 
</dependency> 

Código:

package yourpack; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.core.Response; 

@Path("/path_to_data") 
public class DataResource { 
    @GET 
    @Path("/{param}") 
    public Response getMsg(@PathParam("param") String urlparam) { 
     int ok = 200; 
     String result = "Jersey Data resource: " + urlparam; 

     return Response.status(ok).entity(result).build(); 
    } 
} 

Lista de anotaciones: @ MatrixParam, @HeaderParam, @CookieParam, @FormParam, @QueryParam, @PathParam

Cuestiones relacionadas