解决Volley框架下JsonObjectRequest以POST提交数据,服务端无法获取数据的问题。

首先介绍解决办法:

1、参考这位仁兄的办法,http://blog.csdn.net/onlysnail/article/details/47905375,自定义MyJsonObjectRequest。
2、修改你的服务端方法,使其可以接收JSONObject对象的数据。
3、使用StringRequest。
提示:Volley其实没有坑,他这样写有他的道理,主要看你怎么去用。JsonObjectRequest 传递的参数是json数据,关键看你的服务端是否支持接收json数据。

参考源码:

android:

RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext());
            final Map map = new HashMap<>();
            map.put(BusinessCode.CERTIFICATE, login_certificate);
            map.put(BusinessCode.PASSWORD, password);

            /**
             * 直接传递json数据,但是服务端必须支持接收json数据。
             */
            JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
                    Request.Method.POST,
                    "http://www.wlife.cc/access/login",
                    new JSONObject(map),
                    new Response.Listener() {
                        @Override
                        public void onResponse(JSONObject jsonObject) {
                            Log.d("#JsonObjectRequest#", jsonObject.toString());
                            showProgress(false);
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError volleyError) {
                            Log.d("#JsonObject...:Error#", volleyError.getMessage());
                            showProgress(false);
                        }
                    }
            );
            mRequestQueue.add(jsonObjectRequest);

            /**
             * 自定义MyJsonObjectRequest,解决服务端不支持接收json数据。
             * 如不使用json格式传递,可以采用StringRequest请求数据。
             */
            MyJsonObjectRequest myJsonObjectRequest = new MyJsonObjectRequest(
                    "http://www.wlife.cc/access/login",
                    MyJsonObjectRequest.appendParameter("http://www.wlife.cc/access/login", map),
                    new Response.Listener() {
                        @Override
                        public void onResponse(JSONObject jsonObject) {
                            Log.d("#MyJsonObjectRequest#", jsonObject.toString());
                            showProgress(false);
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError volleyError) {
                            Log.d("#MyJson...:Error#", volleyError.getMessage());
                            showProgress(false);
                        }
                    }
            );
            mRequestQueue.add(myJsonObjectRequest);

            /**
             * 以 Key = Value 方式传递数据。
             */
            StringRequest stringRequest = new StringRequest(
                    Request.Method.POST,
                    "http://www.wlife.cc/access/login",
                    new Response.Listener() {

                        @Override
                        public void onResponse(String s) {
                            try {
                                JSONObject jsonObject = new JSONObject(s);
                                Log.e("#StringRequest#", jsonObject.toString());
                                showProgress(false);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    },
                    new Response.ErrorListener() {

                        @Override
                        public void onErrorResponse(VolleyError volleyError) {
                            Log.e("#StringRequest:Error#", volleyError.getMessage());
                        }
                    }){

                @Override
                protected Map getParams() throws AuthFailureError {
                    Map map = new HashMap<>();
                    map.put(BusinessCode.CERTIFICATE,login_certificate);
                    map.put(BusinessCode.PASSWORD,password);
                    return map;
                }
            };
            mRequestQueue.add(stringRequest);


php服务端:

if (isset($_POST['certificate']) && isset($_POST['password'])) {
            $data['certificate']        = htmlspecialchars($_POST['certificate']);
            $data['password']           = htmlspecialchars($_POST['password']);
        }else{
            // 接收json数据
            $_data = file_get_contents("php://input");
            $params = explode("&",$_data);
            foreach ($params as $param) {
                $keyValue = explode("=",$param);
                // $keyValue[0] in values {'certificate','password'}
                $data[$keyValue[0]] = $keyValue[1];
            }
            if (empty($data['certificate']) || empty($data['password'])) {
                $data['certificate'] = json_decode($_data)->certificate;
                $data['password'] = json_decode($_data)->password;
            }  
        }


        if (empty($data['certificate']) || empty($data['password'])) {
            $info['error'] = $this->language->get('error_field_required');
        }else{
            $info = $this->_userModel->accessLogin($data['certificate'], $data['password']);
        }


        header('Content-type:text/json');
        echo json_encode($info);

android studio 下运行结果见图:

解决Volley框架下JsonObjectRequest以POST提交数据,服务端无法获取数据的问题。_第1张图片

你可能感兴趣的:(android)