捕获在 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;

这是我得到答案的地方: