2009-05-13 9 views
11

Tratando de obtener parámetros de una solicitud PUT utilizando HttpServlet # doPut:parámetros Servlet y doPut

public void doPut(HttpServletRequest request, HttpServletResponse response) { 
    String name = request.getParameter("name"); 
    // name is null 
} 

El uso de rizo para enviar la solicitud:

curl -X PUT \ 
     --data "name=batman" \ 
     --header "Content-Type: text/plain" http://localhost:8080/sample.html 

funciona bien con el uso de doGet y GET solicitud de rizo . ¿Me estoy perdiendo de algo?

Respuesta

20

Sobre la base de las observaciones y la investigación adicional que se dieron cuenta de que el servlet no puede asumir nada acerca de los datos que se colocan en el servidor y, por lo tanto, no va a analizar pares de nombre/valor.

La siguiente solución parece ser la forma correcta de manejar cualquier información pasada a través de PUT, y se puede analizar como XML, Nombre/Valor o lo que sea.

BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream()); 

String data = br.readLine(); 
+0

¿Por qué estás tratando de usarlo de una manera que no es para? Sin embargo, puedes jugar con lo que quieras. –

+4

Me encuentro con el mismo problema: estoy tratando de implementar un servicio restfull, PUT está destinado a reemplazar el recurso. Jetty hace que todos los datos estén disponibles en el mapa de parámetros de solicitud, sin embargo tomcat no ... – Andrej

+0

De acuerdo con Java Web Services: Up and Running, "doPost y doPut difieren significativamente porque el tiempo de ejecución de los contenedores de servlet no genera un mapa de parámetros utilizable. es el caso tanto en Tomcat como en Jetty) " – Jason

1

¿Qué quieres decir con doPut() no está funcionando? Hasta donde yo sé, no funciona como doGet() o doPost(), donde tiene parámetros de solicitud y esas cosas.

PUT se puede utilizar para poner algo en el servidor. En particular, la operación PUT permite que un cliente coloque un archivo en el servidor y es similar a enviar un archivo por FTP. Mira este ejemplo, lo encontré en JGuru.

->GET /file.dat HTTP/1.1 

<-HTTP/1.1 404 Not Found 

->PUT /file.dat HTTP/1.1 
Content-Length: 6 
Content-Type: text/plain 

Hello! 

<-HTTP/1.1 200 OK 

->GET /file.dat HTTP/1.1 

<-HTTP/1.1 200 OK 
Content-Length: 6 
Content-Type: text/plain 

Hello! 
0

A diferencia de doGet() y doPost() métodos, que no son capaces de obtener los parámetros de la petición utilizando el método getParameter() en doPut() y doDelete() métodos. Necesitamos recuperarlos manualmente del flujo de entrada.

El siguiente método recupera los parámetros de solicitud y los devuelve en un mapa:

public static Map<String, String> getParameterMap(HttpServletRequest request) { 

    BufferedReader br = null; 
    Map<String, String> dataMap = null; 

    try { 

     InputStreamReader reader = new InputStreamReader(
       request.getInputStream()); 
     br = new BufferedReader(reader); 

     String data = br.readLine(); 

     dataMap = Splitter.on('&') 
       .trimResults() 
       .withKeyValueSeparator(
         Splitter.on('=') 
         .limit(2) 
         .trimResults()) 
       .split(data); 

     return dataMap; 
    } catch (IOException ex) { 
     Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex); 
    } finally { 
     if (br != null) { 
      try { 
       br.close(); 
      } catch (IOException ex) { 
       Logger.getLogger(Utils.class.getName()).log(Level.WARNING, null, ex); 
      } 
     } 
    } 

    return dataMap; 
} 

El ejemplo utiliza la biblioteca de Google guayaba para analizar los parámetros. Para obtener un ejemplo completo que contiene los métodos doGet(), doPost(), doPut() y doDelete(), puede leer mi Using jsGrid tutorial.

Cuestiones relacionadas