volley jsonobjectrequest example android post android-volley jsonobject

android - example - Los parámetros de Volley JsonObjectRequest Post ya no funcionan



volley android 2018 (11)

... Inicialmente, estaba funcionando para mí ... Luego, de repente, dejó de funcionar y no he realizado 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.

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

RequestQueue queue = Volley.newRequestQueue(this); String url ="http://myserveraddress"; // POST parameters Map<String, String> params = new HashMap<String, String>(); 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<JSONObject>() { @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 de prueba 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 de código fuente Volley javadoc dice que puede pasar un objeto 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.
* @param method, el método HTTP a utilizar
* @param URL URL para obtener el JSON de
* @param jsonRequest A {@link JSONObject} para publicar con la solicitud. Se permite nulo 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:

La solicitud de publicación JsonObjectRequest de Volley no funciona

Volley Post JsonObjectRequest ignorando parámetros mientras usa getHeader y getParams

Volley no envía una solicitud de publicación con parámetros.

Intenté establecer el JSONObject en el constructor JsonObjectRequest en nulo, luego anulé y configuré los parámetros en los métodos "getParams ()", "getBody ()" y "getPostParams ()", pero ninguno de esos reemplazos 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 trata de 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.


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<String, String> params = new HashMap<String, String>(); params.put("tag", "test"); params.put("tag2", "test2"); JSONObject jsonObj = new JSONObject(params);

Creará este objeto JSON y lo 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 HTTP POST se escriben 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 HTTP POST debería, por norma, siempre tratar de leer los parámetros también en JSON (que no sea en texto plano) y, por lo tanto, un servidor que no cumple es un mal servidor.

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


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

String tag_string_req = "string_req"; Map<String, String> params = new HashMap<String, String>(); 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<JSONObject>() { @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!


Podría ayudar a alguien y ahorrarte algo de tiempo pensando. Tuve un problema similar, el código del servidor estaba buscando 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...


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

StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @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<String, String> getParams() throws AuthFailureError { Map<String,String> parameters = new HashMap<String,String>(); parameters.put("parameter",param); return parameters; } }; requestQueue.add(stringRequest);


Puedes hacerlo de esta manera:

CustomRequest request = new CustomRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() { @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<String, String> getParams() throws AuthFailureError { Map<String, String> params = new HashMap<String, String>(); 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 La solicitud de publicación no funciona


Solo tiene que hacer un JSONObject a partir de su HashMap de parámetros:

String url = "https://www.youraddress.com/"; Map<String, String> params = new HashMap(); params.put("first_param", 1); params.put("second_param", 2); JSONObject parameters = new JSONObject(params); JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, url, parameters, new Response.Listener<JSONObject>() { @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 StringRequest de Volley en su lugar, porque estaba usando demasiado tiempo valioso tratando de hacer que JsonObjectRequest funcionara.

RequestQueue queue = Volley.newRequestQueue(this); String url ="http://myserveraddress"; StringRequest strRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @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<String, String> getParams() { Map<String, String> params = new HashMap<String, String>(); params.put("tag", "test"); return params; } }; queue.add(strRequest);

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


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

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


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

En PHP:

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


Utilice la clase auxiliar CustomJsonObjectRequest mencionada here .

e implementar así:

CustomJsonObjectRequest request = new CustomJsonObjectRequest(Method.POST, URL, null, new Response.Listener<JSONObject>() { @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<String, String> getParams() throws AuthFailureError { Map<String, String> params = new HashMap<String, String>(); params.put("id", id); params.put("password", password); return params; } }; VolleySingleton.getInstance().addToRequestQueue(request);