Getting request payload from POST request in Java servlet

JavaHttpServletsPost

Java Problem Overview


I have a javascript library that is sending a POST request to my Java servlet, but in the doPost method, I can't seem to get the contents of the request payload. In chrome Developer Tools, all the content is in the Request Payload section in the headers tab, and the content is there, and I know that the POST is being received by the doPost method, but it just comes up blank.

For the HttpServletRequest object, what way can I get the data in the request payload?

Doing request.getParameter() or request.getAttributes() both end up with no data

Java Solutions


Solution 1 - Java

Simple answer:
Use getReader() to read the body of the request

More info:
There are two methods for reading the data in the body:

  1. getReader() returns a BufferedReader that will allow you to read the body of the request.

  2. getInputStream() returns a ServletInputStream if you need to read binary data.

Note from the docs: "[Either method] may be called to read the body, not both."

Solution 2 - Java

String payloadRequest = getBody(request);

Using this method

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

Solution 3 - Java

You can use Buffer Reader from request to read

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

Solution 4 - Java

Java 8 streams

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

Solution 5 - Java

With Apache Commons IO you can do this in one line.

IOUtils.toString(request.getReader())

Solution 6 - Java

If the contents of the body are a string in Java 8 you can do:

Solution 7 - Java

If you are able to send the payload in JSON, this is a most convenient way to read the playload:

Example data class:

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

Example payload (request body):

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

Code to read payload in servlet (requires com.google.gson.*):

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

That's all. Nice, easy and clean. Don't forget to set the content-type header to application/json.

Solution 8 - Java

Using Java 8 try with resources:

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

Solution 9 - Java

You only need

> request.getParameterMap()

for getting the POST and GET - Parameters.

The Method returns a Map<String,String[]>.

You can read the parameters in the Map by

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionFasih AwanView Question on Stackoverflow
Solution 1 - JavadavidfrancisView Answer on Stackoverflow
Solution 2 - JavaAdrian Ayala TorresView Answer on Stackoverflow
Solution 3 - JavaFizer KhanView Answer on Stackoverflow
Solution 4 - JavabbvianaView Answer on Stackoverflow
Solution 5 - JavaDiji AdeyemoView Answer on Stackoverflow
Solution 6 - JavaLloyd RochesterView Answer on Stackoverflow
Solution 7 - JavaHarry DeveloperView Answer on Stackoverflow
Solution 8 - JavaTimothy HeiderView Answer on Stackoverflow
Solution 9 - JavaArolView Answer on Stackoverflow