捕获在 servlet 中使用 android volley 发送的 jsonobject 请求
Catch jsonobject request sent using android volley inside servlet
我正在尝试使用 android volley 库向服务器发送 json 对象 post 请求。
这里是android边码:
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);
还有我的服务器端代码:
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);
}
但是我在 android 方面得到的回应是:
I/response: [{"error":"Error response"}]
这意味着执行servlet.And的else块也证明了request.getParameter("cartList")
为null。 android 截击请求中有什么我遗漏的吗?任何帮助将不胜感激。谢谢你。
更新:
重写 getParams()
方法也得到相同的结果。
final String jsonString = new Gson().toJson(jsonSendArray, new TypeToken<ArrayList<CartItem>>() {
}.getType());
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.toString());
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("cartList", jsonString);
return params;
}
};
不知道这是否是一个好方法。但我设法解决了如下问题:
在我android这边:
我确实覆盖了 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 响应。
我遇到了同样的问题,主要是因为在服务器端,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;
这是我得到答案的地方:
我正在尝试使用 android volley 库向服务器发送 json 对象 post 请求。
这里是android边码:
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);
还有我的服务器端代码:
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);
}
但是我在 android 方面得到的回应是:
I/response: [{"error":"Error response"}]
这意味着执行servlet.And的else块也证明了request.getParameter("cartList")
为null。 android 截击请求中有什么我遗漏的吗?任何帮助将不胜感激。谢谢你。
更新:
重写 getParams()
方法也得到相同的结果。
final String jsonString = new Gson().toJson(jsonSendArray, new TypeToken<ArrayList<CartItem>>() {
}.getType());
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.toString());
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("cartList", jsonString);
return params;
}
};
不知道这是否是一个好方法。但我设法解决了如下问题:
在我android这边:
我确实覆盖了 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 响应。
我遇到了同样的问题,主要是因为在服务器端,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;
这是我得到答案的地方: