2009-05-13 2 views
11

Попытка получить параметры из запроса PUT с использованием HttpServlet # doPut:параметры сервлетов и doPut

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

Использование локон, чтобы отправить запрос:

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

прекрасно работает с использованием doGet и GET локон запрос , Я что-то упускаю?

ответ

20

На основе замечаний и дальнейших исследований я понял, что Servlet ничего не может предположить о данных будучи надета на сервер и, следовательно, не будет разбирать пары имя/значение.

Следующее решение, по-видимому, является правильным способом обработки любых данных, передаваемых через PUT, и может анализироваться как XML, Name/Value или что-то еще.

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

String data = br.readLine(); 
+0

Почему вы пытаетесь использовать его так, как это не предназначено? Однако вы можете поиграть с вещами, как вам будет угодно. –

+4

Я сталкиваюсь с той же проблемой: я пытаюсь реализовать restfull-сервис, PUT предназначен для замены ресурса. Jetty делает все данные доступными на карте параметров запроса, однако tomcat не делает. – Andrej

+0

Согласно Java Web Services: Up и Running, «doPost и doPut значительно отличаются, потому что время выполнения контейнеров сервлетов не генерирует полезную карту параметров (это это как в Tomcat, так и в Jetty) " – Jason

1

Что вы хотите сказать: doPut() не работает? Насколько мне известно, он не работает как doGet() или doPost(), где у вас есть параметры запроса и прочее.

PUT можно использовать, чтобы поместить что-то на сервер. В частности, операция PUT позволяет клиенту размещать файл на сервере и похожа на отправку файла по FTP. Проверьте этот пример, я нашел на 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

В отличие от doGet() и doPost() методов, мы не можем получить параметры запроса, используя метод getParameter() в doPut() и doDelete() методов. Нам нужно получить их вручную из входного потока.

Следующий метод извлекает параметры запроса и возвращает их в карте:

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

В примере используется библиотека Guava Google для синтаксического анализа параметров. Полный пример, содержащий методы doGet(), doPost(), doPut() и doDelete(), вы можете прочитать мои Using jsGrid tutorial.