2017-02-14 3 views
0

Это журнал с сервера:Java HttpServlet не удалось получить какие-либо параметры из запроса POST, сделанного клиентом, используя OKHttp

POST Request reader reads:--3cd58f21-8ffa-46a0-b1c0-0e4660c2ca28 
POST Request reader reads:Content-Disposition: form-data; name="device" 
POST Request reader reads:Content-Length: 163 
POST Request reader reads: 
POST Request reader reads:{"deviceId":"5ccf7f0fb7b1","manufacturer":"Wow Lamp","name":"Wow-b7b1","type":"lamp","userId":"amzn1.account.AGGL3JOPQ3UTF74KQY2TJCYSYNAQ","timer":0,"chosen":true} 
POST Request reader reads:--3cd58f21-8ffa-46a0-b1c0-0e4660c2ca28-- 

Результат выше, что читатель прочитал из запроса. Но если getParameter вызывается из экземпляра запроса, карта параметров имеет значение NULL.

Это содержание карты параметров:

POST Request:{} 

Как вы можете видеть, что отображение не содержит параметр, но читатель может прочитать данные, отправленные клиентом.

Это код сервера:

@Override 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException 
{  
    System.out.println("POST Request:" + req.getParameterMap()); 

    if(isPostRequestValid(req)) 
    { 
     try 
     { 
      handleRequest(req); 
     } 

     catch (JSONException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    sendResponse(resp); 

    try 
    { 
     BufferedReader reader = req.getReader(); 

     String inputLine; 

     while((inputLine = reader.readLine()) != null) 
     { 
      System.out.println("POST Request reader reads:" + inputLine); 
     } 
    } 

    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 

Там должен быть какой-то кодирование ошибка на стороне клиента

Это код клиента:

new Thread(new Runnable() { 
      @Override 
      public void run() { 
       OkHttpClient client = new OkHttpClient(); 

       RequestBody requestBody = new MultipartBuilder() 
         .type(MultipartBuilder.FORM) //this is what I say in my POSTman (Chrome plugin) 
         .addFormDataPart("device", device) 
         .build(); 

       Request request = new Request.Builder() 
         .url(Constant.BASE_URL + "update_device.html") 
         .post(requestBody) 
         .build(); 
       try { 
        Response response = client.newCall(request).execute(); 
        String responseString = response.body().string(); 
        response.body().close(); 
        // do whatever you need to do with responseString 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 

Но клиентская сторона использовала данные формы, поэтому что здесь может быть неправильным?

+0

Какая версия OkHttp вы используете? – Serhiy

+0

@Serhiy версия 2.5.1 –

+0

Хмм, я не могу найти эту версию в центре Maven .. есть 2.5.0 и 2.6.0 .. но не 2.5.1 .. Я также не могу найти javadoc для 2.5.1. Дважды проверьте версию пожалуйста. – Serhiy

ответ

0

меня решить проблему, обновив свою OKHttpClient до версии 3.6, а затем изменить запрос часть тела моего кода к этому

RequestBody formBody = new FormBody.Builder() 
     .add("key", "value") 
     .build(); 

Это кажется, что моя версия OKHttpClient до того не включает в себя функциональные возможности для отправки параметры содержимого типа application/x-www-form-urlencoded.

Перед обновлением OKHttpClient может отправлять только параметр содержимого типа multipart/form-data. Но для сервлета я не смог разобрать этот тип контента. Я попытался использовать метод getPart("key"), однако после доступа к этому методу было создано исключение.

Итак, обновление OKHttpClient до версии 3.6 позволит мне использовать класс FormBody, который отправляет параметры запроса с типом содержимого application/x-www-form-urlencoded. Таким образом, теперь сервлет может получить параметры с помощью метода request.getParameter("key").

+0

Вот почему я спрашивал, какую версию сервлета вы используете, потому что версия 2 не поддерживает 'multipart/form-data' (в то время как версия 3 уже делает). Рад, что тебе удалось это отсортировать. – Serhiy

+0

@Serhiy Да, пока вы просили номер версии. Я был в процессе решения проблемы после обновления OKHttpClient. :) –

0

Параметры HTTP POST принимаются в сервлет через параметры запроса, а не путем считывания тела запроса.

+0

Я могу получить только параметры, если тип содержимого, заданный клиентом, - application/x-www-form-urlencoded. Если это multipart/form-data, то параметр read всегда будет null. –