我正在尝试使用android volley库将json对象发布请求发送到服务器。
这是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的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响应。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句