Los parámetros Volley JsonObjectRequest Post ya no funcionan

Estoy tratando de enviar parámetros POST en Volley JsonObjectRequest. Inicialmente, me funcionaba siguiendo lo que dice el código oficial de pasar un JSONObject que contiene los parámetros en el constructor de JsonObjectRequest. Luego, de repente, dejó de funcionar y no hice ningún cambio en el código que estaba funcionando anteriormente. El servidor ya no reconoce que se están enviando los parámetros POST. Aquí está mi código:

RequestQueue queue = Volley.newRequestQueue(this); String url ="http://myserveraddress"; // POST parameters Map params = new HashMap(); params.put("tag", "test"); JSONObject jsonObj = new JSONObject(params); // Request a json response from the provided URL JsonObjectRequest jsonObjRequest = new JsonObjectRequest (Request.Method.POST, url, jsonObj, new Response.Listener() { @Override public void onResponse(JSONObject response) { Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_SHORT).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show(); } }); // Add the request to the RequestQueue. queue.add(jsonObjRequest); 

Aquí está el código PHP del probador simple en el servidor:

 $response = array("tag" => $_POST["tag"]); echo json_encode($response); 

La respuesta que obtengo es {"tag":null}
Ayer, funcionó bien y respondía con {"tag":"test"}
No he cambiado nada, pero hoy ya no funciona.

En el constructor del código fuente de Volley, javadoc, dice que puede pasar un JSONObject en el constructor para enviar parámetros de publicación en “@param jsonRequest”: https://android.googlesource.com/platform/frameworks/volley/+/master/src /main/java/com/android/volley/toolbox/JsonObjectRequest.java

/ **
* Crea una nueva solicitud.
* Método @param el método HTTP para usar
* @param url URL para recuperar el JSON de
* @param jsonRequest A {@link JSONObject} para publicar con la solicitud. Nulo está permitido y
* indica que no se publicarán parámetros junto con la solicitud.

He leído otras publicaciones con preguntas similares, pero las soluciones no me han funcionado:

Volley JsonObjectRequest Post request not working

Volley Post JsonObjectRequest ignora los parámetros al usar getHeader y getParams

Volley no envía una solicitud posterior con parámetros.

Intenté configurar JSONObject en el constructor JsonObjectRequest para que anulara, luego anulara y estableciera los parámetros en los métodos “getParams ()”, “getBody ()” y “getPostParams ()”, pero ninguna de esas alteraciones ha funcionado para yo. Otra sugerencia fue utilizar una clase auxiliar adicional que básicamente crea una solicitud personalizada, pero esa solución es demasiado compleja para mis necesidades. Si se llega a eso, haré cualquier cosa para que funcione, pero espero que haya una razón simple de por qué mi código estaba funcionando, y luego simplemente se detuvo , y también una solución simple.

    Solo tienes que crear un JSONObject desde tu HashMap de parámetros:

     String url = "https://www.youraddress.com/"; Map params = new HashMap(); params.put("first_param", 1); params.put("second_param", 2); JSONObject parameters = new JSONObject(params); JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.GET, url, parameters, new Response.Listener() { @Override public void onResponse(JSONObject response) { //TODO: handle success } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); //TODO: handle failure } }); Volley.newRequestQueue(this).add(jsonRequest); 

    Terminé usando Volley’s StringRequest en su lugar, porque estaba usando demasiado tiempo valioso tratando de hacer que JsonObjectRequest funcione.

     RequestQueue queue = Volley.newRequestQueue(this); String url ="http://myserveraddress"; StringRequest strRequest = new StringRequest(Request.Method.POST, url, new Response.Listener() { @Override public void onResponse(String response) { Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show(); } }) { @Override protected Map getParams() { Map params = new HashMap(); params.put("tag", "test"); return params; } }; queue.add(strRequest); 

    Esto funcionó para mí. Es tan simple como JsonObjectRequest, pero utiliza una cadena en su lugar.

    Tuve un problema similar, pero descubrí que el problema no estaba en el lado del cliente, sino en el del servidor. Cuando envía un JsonObject , necesita obtener el objeto POST de esta manera (en el lado del servidor):

    En PHP:

     $json = json_decode(file_get_contents('php://input'), true); 

    Puede usar StringRequest para hacer las mismas cosas que puede con JsonObjectRequest, mientras todavía puede enviar fácilmente parámetros de POST. Lo único que tienes que hacer es crear un JsonObject de la Cadena de solicitud que obtienes, y desde allí puedes continuar como si fuera JsonObjectRequest.

     StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener() { @Override public void onResponse(String response) { try { //Creating JsonObject from response String JSONObject jsonObject= new JSONObject(response.toString()); //extracting json array from response string JSONArray jsonArray = jsonObject.getJSONArray("arrname"); JSONObject jsonRow = jsonArray.getJSONObject(0); //get value from jsonRow String resultStr = jsonRow.getString("result"); } catch (JSONException e) { } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }){ @Override protected Map getParams() throws AuthFailureError { Map parameters = new HashMap(); parameters.put("parameter",param); return parameters; } }; requestQueue.add(stringRequest); 

    El uso del objeto JSONObject para enviar parámetros significa que los parámetros estarán en formato JSON en el cuerpo de la solicitud HTTP POST:

     Map params = new HashMap(); params.put("tag", "test"); params.put("tag2", "test2"); JSONObject jsonObj = new JSONObject(params); 

    Creará este objeto JSON e insertará en el cuerpo de la solicitud HTTP POST:

     {"tag":"test","tag2":"test2"} 

    Luego, el servidor debe decodificar el JSON para comprender estos parámetros POST.

    Pero normalmente los parámetros de HTTP POST son escribir en el cuerpo como:

     tag=test&tag2=test2 

    Pero AHORA aquí la pregunta es por qué Volley se establece de esta manera?

    Un servidor que lee un método POST HTTP debería, por norma, siempre intentar leer parámetros también en JSON (que no sea en texto plano) y, por lo tanto, un servidor que no logra es un servidor defectuoso.

    ¿O en su lugar un cuerpo HTTP POST con parámetros en JSON no es lo que normalmente quiere un servidor?

    Utilice la clase de ayuda CustomJsonObjectRequest mencionada aquí .

    e implementar así –

     CustomJsonObjectRequest request = new CustomJsonObjectRequest(Method.POST, URL, null, new Response.Listener() { @Override public void onResponse(JSONObject response) { Toast.makeText(getActivity(), response.toString(), Toast.LENGTH_SHORT).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(getActivity(), "Error.", Toast.LENGTH_SHORT).show(); } }) { @Override protected Map getParams() throws AuthFailureError { Map params = new HashMap(); params.put("id", id); params.put("password", password); return params; } }; VolleySingleton.getInstance().addToRequestQueue(request); 

    Podría ayudar a alguien y ahorrarle algo de tiempo para pensar. Tuve un problema similar, el código del servidor buscaba el encabezado Content-Type. Lo estaba haciendo de esta manera:

     if($request->headers->content_type == 'application/json' ){ //Parse JSON... } 

    Pero Volley estaba enviando el encabezado así:

     'application/json; charset?utf-8' 

    Cambiar el código del servidor a esto hizo el truco:

     if( strpos($request->headers->content_type, 'application/json') ){ //Parse JSON... 

    Tuve un problema similar. Pero descubrí que el problema no estaba en el lado del servidor, sino que el problema es sobre el caché. Debe borrar su Caché de RequestQueue.

     RequestQueue requestQueue1 = Volley.newRequestQueue(context); requestQueue1.getCache().clear(); 

    Puedes hacerlo de esta manera:

     CustomRequest request = new CustomRequest(Request.Method.POST, url, null, new Response.Listener() { @Override public void onResponse(JSONObject response) { // Toast.makeText(SignActivity.this, response.toString(), Toast.LENGTH_SHORT).show(); Log.d("response",""+response.toString()); String status = response.optString("StatusMessage"); String actionstatus = response.optString("ActionStatus"); Toast.makeText(SignActivity.this, ""+status, Toast.LENGTH_SHORT).show(); if(actionstatus.equals("Success")) { Intent i = new Intent(SignActivity.this, LoginActivity.class); startActivity(i); finish(); } dismissProgress(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(SignActivity.this, "Error."+error.toString(), Toast.LENGTH_SHORT).show(); Log.d("response",""+error.toString()); dismissProgress(); } }) { @Override public String getBodyContentType() { return "application/x-www-form-urlencoded; charset=UTF-8"; } @Override protected Map getParams() throws AuthFailureError { Map params = new HashMap(); params.put("Email", emailval); params.put("PassWord", passwordval); params.put("FirstName", firstnameval); params.put("LastName", lastnameval); params.put("Phone", phoneval); return params; } }; AppSingleton.getInstance(SignActivity.this.getApplicationContext()).addToRequestQueue(request, REQUEST_TAG); 

    según CustomRequest debajo del enlace Volley JsonObjectRequest Post request not working

    Funciona.
    Analicé la respuesta del objeto json usando esto: funciona como un amuleto.

     String tag_string_req = "string_req"; Map params = new HashMap(); params.put("user_id","CMD0005"); JSONObject jsonObj = new JSONObject(params); String url="" //your link JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST, url, jsonObj, new Response.Listener() { @Override public void onResponse(JSONObject response) { Log.d("responce", response.toString()); try { // Parsing json object response // response will be a json object String userbalance = response.getString("userbalance"); Log.d("userbalance",userbalance); String walletbalance = response.getString("walletbalance"); Log.d("walletbalance",walletbalance); } catch (JSONException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show(); } }); AppControllerVolley.getInstance().addToRequestQueue(jsonObjReq, tag_string_req); 

    ¡buena suerte! ¡buenas noches!

    “… Inicialmente, funcionó para mí … Luego, de repente, dejó de funcionar y no hice ningún cambio en el código”

    si no ha realizado ningún cambio en un código que funcionaba anteriormente, le sugiero que verifique otros parámetros, como la URL , ya que la dirección IP puede cambiar si está utilizando su propia computadora como servidor.