Запрос веб-сервисов на отдых с использованием pojo объекта и метода post
Я создал спокойный веб-сервис:
@POST
@Path("grd")
@Consumes("application/json")
@Produces("text/plain")
public String guardarDato(PostParams jsonObject) {
/*
something here
}
PostParams - это pojo:
public class PostParams {
private final Map<String, String> postParamsList;
public PostParams() {
postParamsList = new HashMap<>();
}
public void addParameter(String name, String value) {
postParamsList.put(name, value);
}
public String getPostParamsList(String name) {
return postParamsList.get(name);
}
public void getPostParamsMap() {
if (postParamsList.isEmpty()) {
System.out.println("Parametros vacios");
} else {
for (String key : postParamsList.keySet()) {
System.out.println("Clave: " + key + " -> Valor: " + postParamsList.get(key));
}
}
}
}
Я пытаюсь вызвать этот веб-сервис с Android с помощью HttpUrlConnection, но мой объект в моих веб-сервисах имеет значение null pojo.
try {
URL url = new URL("http://localhost:8080/VfqCh/hgt/opli/grd");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
// conn.setRequestProperty("Accept", "application/json");
PostParams postParams = new PostParams();
postParams.addParameter("h", "51rt3");
postParams.addParameter("x", "dsfsd8698sdfs");
postParams.addParameter("ax", "Dairon");
postParams.addParameter("tf", "D");
// String input = "{\"qty\":100,\"name\":\"iPad 4\"}";
Gson gson = new Gson();
String gString = gson.toJson(postParams, PostParams.class);
try (OutputStreamWriter printout = new OutputStreamWriter(conn.getOutputStream())) {
printout.write(gString);
printout.flush();
}
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println(output);
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Информация отправляется веб-сервисам, но объект является нулевым. если я изменю тип объекта, который получают в веб-сервисах, если он работает!:
@POST
@Path("grd")
@Consumes("application/json")
@Produces("text/plain")
public String guardarDato(String jsonObject) {
/*
something here
}
Но мне нужно получить объект в веб-сервисах! Это возможно?
1 ответ
Вы сделали POJO для HashMap, но вы могли просто использовать JsonObject
это уже предоставлено Gson и в основном действует как HashMap. Затем вы toString
это, и у вас есть строка JSON, которую вы можете отправить на сервер. Там нет необходимости Gson.toJson
и беспокоиться, если он был преобразован правильно.
Ваш сервер принимает строку JSON, как определено
@Consumes("application/json")
Следовательно, это должен быть метод
public String guardarDato(String jsonObject) {
Вам нужно будет добавить Gson в качестве зависимости для вашего сервера, тогда вы сможете получить JSON для объекта с чем-то вроде PostParams params = Gson.fromJson(jsonObject, PostParams.class)
при условии, что данные были отправлены правильно со стороны клиента, но, как уже говорилось ранее, ваш POJO не добавляет много функциональности поверх JsonObject
или простой HashMap