Параметры сервлета и doPut
Попытка получить параметры из запроса PUT с использованием HttpServlet # doPut:
public void doPut(HttpServletRequest request, HttpServletResponse response) {
String name = request.getParameter("name");
// name is null
}
Использование curl для отправки запроса:
curl -X PUT \
--data "name=batman" \
--header "Content-Type: text/plain" http://localhost:8080/sample.html
отлично работает с использованием запроса doGet и GET curl. Я что-то пропустил?
Ответы
Ответ 1
Основываясь на комментариях и дальнейших исследованиях, я понял, что Servlet не может принять что-либо о данных, которые помещаются на сервер, и поэтому не будет анализировать пары имя/значение.
Следующее решение, по-видимому, является правильным способом обработки любых данных, передаваемых через PUT, и может анализироваться как XML, Name/Value и т.д.
BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream());
String data = br.readLine();
Ответ 2
Что вы подразумеваете под 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!
Ответ 3
В отличие от методов 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;
}
В примере используется библиотека Google Guava для анализа параметров.
Для полного примера, содержащего методы doGet()
, doPost()
, doPut()
и doDelete()
, вы можете прочитать Использование jsGrid-учебника.