http get - 在Java servlet中從POST請求獲取請求負載





form data (9)


String payloadRequest = getBody(request);

使用這種方法

public static String getBody(HttpServletRequest request) throws IOException {

    String body = null;
    StringBuilder stringBuilder = new StringBuilder();
    BufferedReader bufferedReader = null;

    try {
        InputStream inputStream = request.getInputStream();
        if (inputStream != null) {
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            char[] charBuffer = new char[128];
            int bytesRead = -1;
            while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                stringBuilder.append(charBuffer, 0, bytesRead);
            }
        } else {
            stringBuilder.append("");
        }
    } catch (IOException ex) {
        throw ex;
    } finally {
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException ex) {
                throw ex;
            }
        }
    }

    body = stringBuilder.toString();
    return body;
}

我有一個向我的Java servlet發送POST請求的JavaScript庫,但是在doPost方法中,我似乎無法獲取請求有效內容的內容。 在Chrome開發人員工具中,所有內容位於“標題”選項卡的“請求負載”部分,並且內容在那裡,並且我知道doPost方法正在接收POST,但它只是空白。

對於HttpServletRequest對象,我可以通過什麼方式獲取請求負載中的數據?

執行request.getParameter()request.getAttributes()都沒有數據




如果您能夠以JSON發送有效負載,則這是讀取播放負載最方便的方式:

示例數據類:

public class Person {
    String firstName;
    String lastName;
    // Getters and setters ...
}

示例有效負載(請求主體):

{ "firstName" : "John", "lastName" : "Doe" }

讀取servlet中的有效內容的代碼(需要com.google.gson。*):

Person person = new Gson().fromJson(request.getReader(), Person.class);

就這樣。 漂亮,簡單而乾淨。 不要忘記將content-type header設置為application / json。




您可以使用緩衝區讀取器從請求讀取

    // Read from request
    StringBuilder buffer = new StringBuilder();
    BufferedReader reader = request.getReader();
    String line;
    while ((line = reader.readLine()) != null) {
        buffer.append(line);
    }
    String data = buffer.toString()



Java 8流

String body = request.getReader().lines()
    .reduce("", (accumulator, actual) -> accumulator + actual);



你只需要

request.getParameterMap()

獲取POST和GET參數。

該方法返回一個Map<String,String[]>

您可以閱讀地圖依據中的參數

Map<String, String[]> map = request.getParameterMap();
//Reading the Map
//Works for GET && POST Method
for(String paramName:map.keySet()) {
    String[] paramValues = map.get(paramName);

    //Get Values of Param Name
    for(String valueOfParam:paramValues) {
        //Output the Values
        System.out.println("Value of Param with Name "+paramName+": "+valueOfParam);
    }
}



如果在Java 8中正文的內容是一個字符串,你可以這樣做:

String body = request.getReader().lines().collect(Collectors.joining());




使用Java 8嘗試使用資源:

    StringBuilder stringBuilder = new StringBuilder();
    try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()))) {
        char[] charBuffer = new char[1024];
        int bytesRead;
        while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
            stringBuilder.append(charBuffer, 0, bytesRead);
        }
    }



使用getReader()來讀取請求的主體




如果你正在尋找基於承諾的HTTP請求, axios很好地完成了它的工作。

  const axios = require('axios');

  axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });




java http servlets post