捕获在Servlet内部使用Android Volley发送的jsonobject请求

Madushan Perera

我正在尝试使用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;
                }
            };
Madushan Perera

不知道这是否是一个好方法。但我设法解决如下:

在我的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Volley使用JSONArray发送POST请求

Volley-使用JSONArrayRequest发送POST请求

使用 Volley 在 POST 请求中发送参数

HTTP POST请求通过Volley发送JsonObject

在Android中使用Volley发送HTTP GET请求时出错

使用Volley发送帖子请求并使用PHP接收

使用Volley发送带有JSON数据的POST请求

如何使用Volley发送带有JSON正文的POST请求?

如何使用放心在体内发送JsonObject以进行后期请求?

如何使用Volley将JSONObject作为表单数据发送到服务器

Volley使用POST方法将JSONObject发送到服务器

如何使用自定义对象作为参数发出Volley JSONObject请求?

使用 Volley 解析获取 JsonObject

使用Volley Android请求删除

Android Volley 发布请求

Android Volley缓存请求

Android monits Volley请求

使用Volley库的StringRequest类将Unicode请求发送到Web服务

如何在没有HttpEntity的情况下使用Volley发送多部分请求?

使用Volley在POST请求中发送数组的正确方法是什么?

如何使用Volley发送http get请求并将数据存储到Maps with Keys?

(Android Volley)JSONObject无法转换为JSONArray

Android Volley POST JsonObject并获取JsonArray或JsonObject或其他响应

如何从JavaScript(AJAX请求)向Servlet发送和捕获参数

Android Volley如何在多个发送中捕获超时错误

Android Volley:服务器上接收到带有POST请求发送的String参数的空值

Android-取消Volley请求

重试请求onErrorResponse Android Volley

Android Volley Server XML请求