Volley JsonObjectRequest Post request not working

后端 未结 9 1838
有刺的猬
有刺的猬 2020-11-22 06:25

I am using android Volley for making a request. So I use this code. I don\'t understand one thing. I check in my server that params is always null. I consider that getParams

相关标签:
9条回答
  • 2020-11-22 07:03

    When you working with JsonObject request you need to pass the parameters right after you pass the link in the initialization , take a look on this code :

            HashMap<String, String> params = new HashMap<>();
            params.put("user", "something" );
            params.put("some_params", "something" );
    
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, "request_URL", new JSONObject(params), new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
    
               // Some code 
    
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //handle errors
            }
        });
    
    
    }
    
    0 讨论(0)
  • 2020-11-22 07:08

    try to use this helper class

    import java.io.UnsupportedEncodingException;
    import java.util.Map;    
    import org.json.JSONException;
    import org.json.JSONObject;    
    import com.android.volley.NetworkResponse;
    import com.android.volley.ParseError;
    import com.android.volley.Request;
    import com.android.volley.Response;
    import com.android.volley.Response.ErrorListener;
    import com.android.volley.Response.Listener;
    import com.android.volley.toolbox.HttpHeaderParser;
    
    public class CustomRequest extends Request<JSONObject> {
    
        private Listener<JSONObject> listener;
        private Map<String, String> params;
    
        public CustomRequest(String url, Map<String, String> params,
                Listener<JSONObject> reponseListener, ErrorListener errorListener) {
            super(Method.GET, url, errorListener);
            this.listener = reponseListener;
            this.params = params;
        }
    
        public CustomRequest(int method, String url, Map<String, String> params,
                Listener<JSONObject> reponseListener, ErrorListener errorListener) {
            super(method, url, errorListener);
            this.listener = reponseListener;
            this.params = params;
        }
    
        protected Map<String, String> getParams()
                throws com.android.volley.AuthFailureError {
            return params;
        };
    
        @Override
        protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
            try {
                String jsonString = new String(response.data,
                        HttpHeaderParser.parseCharset(response.headers));
                return Response.success(new JSONObject(jsonString),
                        HttpHeaderParser.parseCacheHeaders(response));
            } catch (UnsupportedEncodingException e) {
                return Response.error(new ParseError(e));
            } catch (JSONException je) {
                return Response.error(new ParseError(je));
            }
        }
    
        @Override
        protected void deliverResponse(JSONObject response) {
            // TODO Auto-generated method stub
            listener.onResponse(response);
        }
    }
    

    In activity/fragment do use this

    RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
    CustomRequest jsObjRequest = new CustomRequest(Method.POST, url, params, this.createRequestSuccessListener(), this.createRequestErrorListener());
    
    requestQueue.add(jsObjRequest);
    
    0 讨论(0)
  • 2020-11-22 07:08

    The override function getParams works fine. You use POST method and you have set the jBody as null. That's why it doesn't work. You could use GET method if you want to send null jBody. I have override the method getParams and it works either with GET method (and null jBody) either with POST method (and jBody != null)

    Also there are all the examples here

    0 讨论(0)
  • 2020-11-22 07:12



    build gradle(app)

    dependencies {
        implementation fileTree(dir: "libs", include: ["*.jar"])
        implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
        implementation 'androidx.core:core-ktx:1.1.0'
        implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'
        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test.ext:junit:1.1.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
        implementation 'com.android.volley:volley:1.1.1'
    }
    

    android manifest
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    MainActivity
    When you use JsonObjectRequest it is mandatory to send a jsonobject and receive jsonobject otherwise you will get an error as it only accepts jsonobject.
    import com.android.volley.Request
    import com.android.volley.Response
    import com.android.volley.toolbox.JsonObjectRequest
    import com.android.volley.toolbox.Volley
    
    fun peticion(){
        val jsonObject = JSONObject()
        jsonObject.put("user", "jairo")
        jsonObject.put("password", "1234")
        val queue = Volley.newRequestQueue(this)
        val url = "http://192.168.0.3/get_user.php"
        // GET: JsonObjectRequest( url, null,
        // POST: JsonObjectRequest( url, jsonObject,
        val jsonObjectRequest = JsonObjectRequest( url, jsonObject,
            Response.Listener { response ->
                // Check if the object 'msm' does not exist
                if(response.isNull("msm")){
                    println("Name: "+response.getString("nombre1"))
                }
                else{
                    // If the object 'msm' exists we print it
                    println("msm: "+response.getString("msm"))
                }
            },
            Response.ErrorListener { error ->
                error.printStackTrace()
                println(error.toString())
            }
        )
        queue.add(jsonObjectRequest)
    }
    

    file php get_user.php
    <?php
        header("Access-Control-Allow-Origin: *");
        header("Access-Control-Allow-Headers: *");
        // we receive the parameters
        $json = file_get_contents('php://input');
        $params = json_decode($json);
        error_reporting(0);
        require_once 'conexion.php';
    
        $mysqli=getConex();
        $user=$params->user;
        $password=$params->password;
        $res=array();
        $verifica_usuario=mysqli_query($mysqli,"SELECT * FROM usuarios WHERE usuario='$user' and clave='$password'");
        if(mysqli_num_rows($verifica_usuario)>0){
            $query="SELECT * FROM usuarios WHERE usuario='$user'";
            $result=$mysqli->query($query);
            while($row = $result->fetch_array(MYSQLI_ASSOC)){
                $res=$row;
            }
        }
        else{
            $res=array('msm'=>"Incorrect user or password");
        }
        $jsonstring = json_encode($res);
        header('Content-Type: application/json');
        echo $jsonstring;
    ?>
    

    file php conexion
    <?php
        function getConex(){
            $servidor="localhost";
            $usuario="root";
            $pass="";  
            $base="db";
            
            $mysqli = mysqli_connect($servidor,$usuario,$pass,$base);
            if (mysqli_connect_errno($mysqli)){
                echo "Fallo al conectar a MySQL: " . mysqli_connect_error();
            }
            $mysqli->set_charset('utf8');
            return $mysqli;
        }
    ?>
    
    0 讨论(0)
  • 2020-11-22 07:17

    Easy one for me ! I got it few weeks ago :

    This goes in getBody() method, not in getParams() for a post request.

    Here is mine :

        @Override
    /**
     * Returns the raw POST or PUT body to be sent.
     *
     * @throws AuthFailureError in the event of auth failure
     */
    public byte[] getBody() throws AuthFailureError {
        //        Map<String, String> params = getParams();
        Map<String, String> params = new HashMap<String, String>();
        params.put("id","1");
        params.put("name", "myname");
        if (params != null && params.size() > 0) {
            return encodeParameters(params, getParamsEncoding());
        }
        return null;
    
    }
    

    (I assumed you want to POST the params you wrote in your getParams)

    I gave the params to the request inside the constructor, but since you are creating the request on the fly, you can hard coded them inside your override of the getBody() method.

    This is what my code looks like :

        Bundle param = new Bundle();
        param.putString(HttpUtils.HTTP_CALL_TAG_KEY, tag);
        param.putString(HttpUtils.HTTP_CALL_PATH_KEY, url);
        param.putString(HttpUtils.HTTP_CALL_PARAM_KEY, params);
    
        switch (type) {
        case RequestType.POST:
            param.putInt(HttpUtils.HTTP_CALL_TYPE_KEY, RequestType.POST);
            SCMainActivity.mRequestQueue.add(new SCRequestPOST(Method.POST, url, this, tag, receiver, params));
    

    and if you want even more this last string params comes from :

    param = JsonUtils.XWWWUrlEncoder.encode(new JSONObject(paramasJObj)).toString();
    

    and the paramasJObj is something like this : {"id"="1","name"="myname"} the usual JSON string.

    0 讨论(0)
  • 2020-11-22 07:18

    It worked for can try this for calling with Volley Json Request and Response ith Java Code .

    public void callLogin(String sMethodToCall, String sUserId, String sPass) {
            RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
    
            JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
                    Request.Method.POST, ConstantValues.ROOT_URL_LOCAL + sMethodToCall.toString().trim(), addJsonParams(sUserId, sPass),
    //                JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, object,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            Log.d("onResponse", response.toString());
                            Toast.makeText(VolleyMethods.this, response.toString(), Toast.LENGTH_LONG).show(); // Test
    
                            parseResponse(response);
    //                        msgResponse.setText(response.toString());
    //                        hideProgressDialog();
                        }
                    },
                    new Response.ErrorListener() {
    
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            VolleyLog.d("onErrorResponse", "Error: " + error.getMessage());
                            Toast.makeText(VolleyMethods.this, error.toString(), Toast.LENGTH_LONG).show();
    //                hideProgressDialog();
                        }
                    }) {
    
                /**
                 * Passing some request headers
                 */
                @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;
                }
    
    
            };
    
            requestQueue.add(jsonObjectRequest);
        }
    
        public JSONObject addJsonParams(String sUserId, String sPass) {
            JSONObject jsonobject = new JSONObject();
            try {
    //            {"id":,"login":"secretary","password":"password"}
    
                ///***//
                Log.d("addJsonParams", "addJsonParams");
    
    //            JSONObject jsonobject = new JSONObject();
    
    //            JSONObject jsonobject_one = new JSONObject();
    //
    //            jsonobject_one.put("type", "event_and_offer");
    //            jsonobject_one.put("devicetype", "I");
    //
    //            JSONObject jsonobject_TWO = new JSONObject();
    //            jsonobject_TWO.put("value", "event");
    //            JSONObject jsonobject = new JSONObject();
    //
    //            jsonobject.put("requestinfo", jsonobject_TWO);
    //            jsonobject.put("request", jsonobject_one);
    
                jsonobject.put("id", "");
                jsonobject.put("login", sUserId); // sUserId
                jsonobject.put("password", sPass); // sPass
    
    
    //            js.put("data", jsonobject.toString());
    
            } catch (JSONException e) {
                e.printStackTrace();
            }
    
            return jsonobject;
        }
    
        public void parseResponse(JSONObject response) {
    
            Boolean bIsSuccess = false; // Write according to your logic this is demo.
            try {
                JSONObject jObject = new JSONObject(String.valueOf(response));
                bIsSuccess = jObject.getBoolean("success");
    
    
            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(VolleyMethods.this, "" + e.toString(), Toast.LENGTH_LONG).show(); // Test
            }
    
        }
    
    0 讨论(0)
提交回复
热议问题