我正在尝试使用android volley库向服务器发送json对象发布请求。
这是android端代码:
@id
我的服务器端代码:
ArrayList<CartItem> jsonSendArray = cartDetails.getShoppingList();
JsonArray array = new Gson().toJsonTree(jsonSendArray, new TypeToken<ArrayList<CartItem>>() {
}.getType()).getAsJsonArray();
JsonObject jsonObject = new JsonObject();
jsonObject.add("cartList", array);
Log.i("json_object", new JSONObject(jsonObject.toString()).toString());//this gives me the out-put in log cat {"cartList":[{"size":"M","product_id":1,"qnty":2},{"size":"S","product_id":4,"qnty":1}]}
String url = "http://10.0.2.2:8080/ECommerceApp/getAllProductsAction";
JsonArrayRequest arrayRequest = new JsonArrayRequest(Request.Method.POST, url,
new JSONObject(jsonObject.toString()),
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Log.i("response", response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("Volley_error", error.toString());
}
});
requestQueue.add(arrayRequest);
但我在android方面得到的回应是:
if (request.getParameter("cartList") != null) {
String jsonList = request.getParameter("cartList");
Type type = new TypeToken<List<CartItem>>() {
}.getType();
List<CartItem> conList = new Gson().fromJson(jsonList, type);
List<ProductHasSize> myList = getCompleteProductCart(conList, s);
String element = new Gson().toJson(myList, new TypeToken<List<ProductHasSize>>() {
}.getType());
response.getWriter().write(element);
} else {
JsonArray array = new JsonArray();
JsonObject jo = new JsonObject();
jo.add("error", new JsonPrimitive("Error response"));
array.add(jo);
String element = new Gson().toJson(array);
response.getWriter().write(element);
}
这意味着执行servlet的else块。并且还证明I/response: [{"error":"Error response"}]
为空。在android截击请求中有什么我错过的吗?任何帮助将不胜感激。谢谢。
更新:
覆盖request.getParameter("cartList")
方法也会给我相同的结果。
getParams()
答案 0 :(得分:1)
不知道这是一个好方法。但我设法将其解决如下:
在我的机器人方面:
我确实覆盖了getHeaders()
方法
JsonArrayRequest arrayRequest = new JsonArrayRequest(Request.Method.POST, url,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Log.i("response",response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("Volley_error", error.getMessage());
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("Content-Type", "application/json");
params.put("cartList", jsonString);
return params;
}
};
在我的Servlet中:
我使用getHeader("")
方法而非使用getParameter("")
if (request.getHeader("cartList") != null) {
String jsonList = request.getHeader("cartList");
Type type = new TypeToken<List<CartItem>>() {
}.getType();
List<CartItem> conList = new Gson().fromJson(jsonList, type);
List<ProductHasSize> myList = getCompleteProductCart(conList, s);
String element = new Gson().toJson(myList, new TypeToken<List<ProductHasSize>>() {
}.getType());
response.getWriter().write(element);
}
现在工作正常。我可以在Volley中获得JSONArray响应。
答案 1 :(得分:0)
我遇到了同样的问题,主要是因为在服务器端,request.getParameter("cartList")
可以使用Content-Type="application/x-www-form-urlencoded"
而不是Content-Type="application/json"
。
解决方案是使用request.getReader()
方法并读取从请求的POST正文中的Android客户端发送的JSON字符串。
BufferedReader bReader = request.getReader();
String line;
String jsonList = "";
if((line = bReader.readLine()) != null)
jsonList += line;
这是我得到答案的地方:https://stackoverflow.com/a/3831791/4938794