2009-05-13 17 views
11

Próbuje parametry z żądania PUT pomocą HttpServlet # doPut:parametry Servlet i doPut

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

Korzystanie curl, aby wysłać żądanie:

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

współpracuje z użyciem doGet i GET curl żądanie . Czy czegoś brakuje?

Odpowiedz

20

Na podstawie uwag i dalszych badań zdałem sobie sprawę, że nie może nic Servlet Zakładamy o dane mogą być wprowadzane na serwerze, a zatem nie będzie analizować pary nazwa/wartość.

Poniższe rozwiązanie wydaje się być właściwym sposobem postępowania z dowolnymi danymi przekazywanymi przez PUT i może być analizowane jako XML, nazwa/wartość lub cokolwiek innego.

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

String data = br.readLine(); 
+0

Dlaczego próbujesz użyć go w sposób, do którego nie jest przeznaczony? Możesz jednak bawić się rzeczami, jak chcesz. –

+4

Występuje ten sam problem: próbuję wdrożyć restfull service, PUT ma zastąpić zasób. Jetty udostępnia wszystkie dane w mapie parametrów żądania, Tomcat jednak nie robi .. – Andrej

+0

Według Java Web Services: uruchomiony „doPost i doPut różnią się znacznie, ponieważ środowisko wykonawcze kontenery serwletów nie generuje użytkowej parametrów mapy (to. dotyczy zarówno Tomcat, jak i Jetty) " – Jason

1

Co oznacza, że ​​doPut() nie działa? O ile mi wiadomo, to nie działa jak doGet() lub doPost(), gdzie masz parametry żądania i takie tam.

PUT można użyć do umieszczenia czegoś na serwerze. W szczególności operacja PUT umożliwia klientowi umieszczenie pliku na serwerze i jest podobna do wysyłania pliku przez FTP. Sprawdź ten przykład, który znalazłem na 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

przeciwieństwie doGet() i doPost() metod, nie jesteśmy w stanie uzyskać parametry żądania używając metody getParameter() w doPut() i doDelete() metod. Musimy pobrać je ręcznie ze strumienia wejściowego.

Poniższa metoda pobiera parametry żądania i zwraca je w mapie:

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; 
} 

Przykład wykorzystuje bibliotekę Guava Google do analizowania parametrów. Pełną przykład zawierającej doGet(), doPost(), doPut() i doDelete() metod, można przeczytać mój Using jsGrid tutorial.