捕获使用android volley在servlet内发送的jsonobject请求

时间:2016-03-05 04:03:34

标签: json servlets http-post android-volley android gson

我正在尝试使用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()

2 个答案:

答案 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