Подтвердить что ты не робот

Параметры сервлета и 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. Я что-то пропустил?

4b9b3361

Ответ 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-учебника.