Mam bibliotekę javascript, która wysyła żądanie POST do mojego serwletu Java, ale w doPost
metodzie nie mogę uzyskać zawartości ładunku żądania. W chrome Developer Tools, cała zawartość znajduje się w sekcji Request Payload na karcie nagłówków, i tam jest, i wiem, że POST jest odbierany metodą doPost, ale po prostu jest pusty.
Dla HttpServletRequest
obiektu, w jaki sposób mogę uzyskać dane w ładunku żądania?
Wykonanie request.getParameter()
lub request.getAttributes()
jedno i drugie kończy się bez danych
Odpowiedzi:
Prosta odpowiedź:
użyj metody getReader (), aby odczytać treść żądania
Więcej informacji:
istnieją dwie metody odczytu danych w treści:
getReader()
zwraca BufferedReader , który umożliwi odczytanie treści żądania.getInputStream()
zwraca ServletInputStream, jeśli chcesz odczytać dane binarne.Uwaga z dokumentacji: „[Każda metoda] może zostać wywołana w celu odczytania treści, a nie obu”.
źródło
Korzystając z tej metody
źródło
request.getInputStream()
nie honoruje to tak jak kodowanie znaków żądaniarequest.getReader()
. Więc w tym przykładzie zastosowano domyślny systemowy zestaw znaków.new BufferedReader(new InputStreamReader(request.getInputStream()))
można uprościć dorequest.getReader()
tego, że jest już buforowany, a także zachowuje kodowanie żądań.javax.servlet.ServletException: java.lang.IllegalStateException: getInputStream() has already been called for this request
kiedy wywołałem getReader () w wyniku otwarcia czytnika.Możesz używać czytnika buforów od żądania do odczytu
źródło
Strumienie Java 8
źródło
(accumulator, actual) -> accumulator + actual
zString::concat
.Dzięki Apache Commons IO możesz to zrobić w jednej linii.
źródło
Jeśli zawartość ciała jest ciągiem w Javie 8, możesz zrobić:
String body = request.getReader().lines().collect(Collectors.joining());
źródło
Jeśli możesz wysłać ładunek w formacie JSON, jest to najwygodniejszy sposób na odczytanie listy odtwarzania:
Przykładowa klasa danych:
Przykładowy ładunek (treść żądania):
Kod do odczytu ładunku w serwlecie (wymaga com.google.gson. *):
To wszystko. Ładny, łatwy i czysty. Nie zapomnij ustawić nagłówka typu zawartości na application / json.
źródło
Użyj Java 8 spróbuj z zasobami:
źródło
Potrzebujesz tylko
aby uzyskać POST i GET - Parametry.
Metoda zwraca plik
Map<String,String[]>
.Możesz odczytać parametry w Mapie wg
źródło
application/x-www-form-urlencoded
; ponieważmultipart/form-data
najwyraźniej musisz uzyskać dostęp do części ciałarequest.getReader()
i przeanalizować ją ręcznie.