【问题标题】:Android Volley POST JSONObject with int, string and jsonobjects带有 int、string 和 jsonobjects 的 Android Volley POST JSONObject
【发布时间】:2017-01-30 20:52:39
【问题描述】:

怎么了

我正在尝试在我的服务器 JSONObject 上发布。

我尝试了一些在堆栈上找到的代码:

        String url = "http://10.0.2.2:8080/order";
    try {
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        String URL = "http://10.0.2.2:8080/order";
        JSONObject jsonBody = new JSONObject();
        jsonBody.put("waiterId", 1);
        jsonBody.put("tableNumber", 4);
        jsonBody.put("remark", "asd");
        jsonBody.put("products", new JSONObject());
        final String requestBody = jsonBody.toString();

        StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.i("VOLLEY", response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("VOLLEY", error.toString());
            }
        }) {
            @Override
            public String getBodyContentType() {
                return "application/json; charset=utf-8";
            }

            @Override
            public byte[] getBody() throws AuthFailureError {
                try {
                    return requestBody == null ? null : requestBody.getBytes("utf-8");
                } catch (UnsupportedEncodingException uee) {
                    VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", requestBody, "utf-8");
                    return null;
                }
            }

            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse response) {
                String responseString = "";
                if (response != null) {
                    responseString = String.valueOf(response.statusCode);
                    // can get more details such as response.headers
                }
                return Response.success(responseString, HttpHeaderParser.parseCacheHeaders(response));
            }
        };

        requestQueue.add(stringRequest);
    } catch (JSONException e) {
        e.printStackTrace();
    }

我遇到了错误:

E/Volley:[275] BasicNetwork.performRequest:http://10.0.2.2:8080/order 的意外响应代码 400 E/VOLLEY: com.android.volley.ServerError

或者这个:

    String url = "http://10.0.2.2:8080/order";
    JSONObject jsonObject = new JSONObject();
    try {
        jsonObject.put("waiterId", 1);
        jsonObject.put("tableNumber", 1);
        jsonObject.put("remark", "zamowienie");
        jsonObject.put("products", new JSONObject());
    } catch (JSONException e) {
        e.printStackTrace();
    }

    JsonObjectRequest jsonObjReq = new JsonObjectRequest(
            Request.Method.POST, url, jsonObject,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.d(TAG, response.toString());
                }
            }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            // As of f605da3 the following should work
            NetworkResponse response = error.networkResponse;
            if (error instanceof ServerError && response != null) {
                try {
                    String res = new String(response.data,
                            HttpHeaderParser.parseCharset(response.headers, "utf-8"));
                    // Now you can use any deserializer to make sense of data
                    JSONObject obj = new JSONObject(res);
                } catch (UnsupportedEncodingException e1) {
                    // Couldn't properly decode data to string
                    e1.printStackTrace();
                } catch (JSONException e2) {
                    // returned data is not JSONObject?
                    e2.printStackTrace();
                }
            }
        }
    }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Content-Type", "application/json; charset=utf-8");
            return headers;
        }
    };

    Singleton.getInstance(this).addToRequestQueue(jsonObjReq);

错误:

E/Volley:[275] BasicNetwork.performRequest:http://10.0.2.2:8080/order 的意外响应代码 400

在第二个中,我找到了提示“Content-Type”的提示,但没有任何改变。

之前我使用 Postman 添加对象,如下所示:

{ “服务员 ID”:3, “表号”:3, "remark" : "orderRemark", “产品” : [] }

有什么问题?也许我糟糕地添加了“产品”。如何添加多个“产品”或发布没有“产品”的 json?

谢谢!

编辑: 我尝试将 JSONObject 更改为 jsonObject = new JSONObject("{ \"waiterId\" : 3, \"tableNumber\" : 3, \"remark\" : \"orderRemark\", \"products\" : [] }" );.现在我没有代码 400 问题。它只是没有发布新元素。它不显示任何错误消息:

编辑 2: 我试过其他方法。效果也不好。

class AsyncT extends AsyncTask<Void,Void,Void> {

@Override
protected Void doInBackground(Void... params) {

    try {
        Log.d("A","1");
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("waiterId", 1);
            Log.d("A","2");
            jsonObject.put("tableNumber", 1);
            jsonObject.put("remark", "zamowienie");
            jsonObject.put("products", new JSONObject());
        } catch (JSONException e) {
            e.printStackTrace();
        }

        URL url = new URL("http://10.0.2.2:8080/order"); 
        URLConnection urlConn;
        DataOutputStream printout;
        DataInputStream input;
        urlConn = url.openConnection();
        urlConn.setDoInput (true);
        urlConn.setDoOutput (true);
        urlConn.setUseCaches (false);
        urlConn.setRequestProperty("Content-Type","application/json");
        urlConn.setRequestProperty("Host", "android.schoolportal.gr");
        urlConn.connect();

        printout = new DataOutputStream(urlConn.getOutputStream ());
        printout.writeBytes(URLEncoder.encode(jsonObject.toString(),"UTF-8"));
        printout.flush ();
        printout.close ();

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}

【问题讨论】:

    标签: android json android-volley


    【解决方案1】:

    simplified coding 为例,它工作得很好,很简单

    【讨论】:

    • 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
    猜你喜欢
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    相关资源
    最近更新 更多