Вопрос-ответ

HttpServletRequest get JSON POST data [duplicate]

HttpServletRequest получает JSON POST data [дубликат]

Я ОТПРАВЛЯЮ HTTP-СООБЩЕНИЕ по URL http://laptop:8080/apollo/services/rpc?cmd=execute

с данными POST

{ "jsondata" : "data" }

Http-запрос имеет Content-Тип application/json; charset=UTF-8

Как мне получить данные POST (jsondata) из HttpServletRequest?

Если я перечислю параметры запроса, я смогу увидеть только один параметр, который является "cmd", а не данные POST.

Переведено автоматически
Ответ 1

Обычно вы можете ПОЛУЧАТЬ и публиковать параметры в сервлете одним и тем же способом:

request.getParameter("cmd");

Но только если данные POST закодированы как пары ключ-значение типа контента: "application / x-www-form-urlencoded", как при использовании стандартной HTML-формы.

Если вы используете другую схему кодирования для своих post-данных, как в вашем случае, когда вы публикуете поток данных json, вам необходимо использовать пользовательский декодер, который может обрабатывать необработанный поток данных из:

BufferedReader reader = request.getReader();

Пример постобработки Json (использует пакет org.json )

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

StringBuffer jb = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
while ((line = reader.readLine()) != null)
jb.append(line);
} catch (Exception e) { /*report an error*/ }

try {
JSONObject jsonObject = HTTP.toJSONObject(jb.toString());
} catch (JSONException e) {
// crash and burn
throw new IOException("Error parsing JSON request string");
}

// Work with the data using methods like...
// int someInt = jsonObject.getInt("intParamName");
// String someString = jsonObject.getString("stringParamName");
// JSONObject nestedObj = jsonObject.getJSONObject("nestedObjName");
// JSONArray arr = jsonObject.getJSONArray("arrayParamName");
// etc...
}
Ответ 2

Вы отправляете данные из другого источника (значит, другой порт или имя хоста)? Если да, то эта совсем недавняя тема, на которую я только что ответил, может быть полезной.

Проблема заключалась в междоменной политике XHR и полезном совете о том, как ее обойти с помощью метода, называемого JSONP. Большим недостатком является то, что JSONP не поддерживает POST-запросы.

Я знаю, что в исходном сообщении нет упоминания о JavaScript, однако JSON обычно используется для JavaScript, поэтому я пришел к такому выводу

java json servlets