Enviando una solicitud POST con JSONArray usando Volley

Quiero enviar una solicitud POST simple en Android con un cuerpo igual a esto:

[ { "value": 1 } ] 

Intenté usar la biblioteca Volley en Android, y este es mi código:

 // the jsonArray that I want to POST String json = "[{\"value\": 1}]"; JSONArray jsonBody = null; try { jsonBody = new JSONArray(json); } catch (JSONException e) { e.printStackTrace(); } final JSONArray finalJsonBody = jsonBody; // starting the request final RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); JsonObjectRequest request = new JsonObjectRequest(com.android.volley.Request.Method.POST,"https://...",null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d("mytag", "Response is: " + response);}}, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("Mytag", "error");}}) { @Override protected Map<String,String> getParams() { // the problem is here... return (Map<String, String>) finalJsonBody; } @Override public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> params = new HashMap<String, String>(); // I put all my headers here like the following one : params.put("Content-Type", "application/json"); return params;}}; queue.add(request); 

El problema es que el método getParams sólo acepta un objeto Map ya que quiero enviar un JSONArray. Por lo tanto, estoy obligado a utilizar un molde, que generan un error entonces …

No sé cómo puedo arreglar eso Gracias

Puede consultar mi siguiente código de ejemplo:

UPDATE para su enlace pastebin:

Como el servidor responde un JSONArray , utilizo JsonArrayRequest lugar de JsonObjectRequest . Y no hay necesidad de anular getBody más.

  mTextView = (TextView) findViewById(R.id.textView); String url = "https://api.orange.com/datavenue/v1/datasources/2595aa553d3049f0b0f03fbaeaa7ddc7/streams/9fe5edb1c76e4968bdcc9c902010bc6c/values"; RequestQueue requestQueue = Volley.newRequestQueue(this); final String jsonString = "[\n" + " {\n" + " \"value\": 1\n" + " }\n" + "]"; try { JSONArray jsonArray = new JSONArray(jsonString); JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.POST, url, jsonArray, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) { mTextView.setText(response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { mTextView.setText(error.toString()); } }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<>(); headers.put("X-OAPI-Key","TQEEGSk8OgWlhteL8S8siKao2q6LIGdq"); headers.put("X-ISS-Key","2b2dd0d9dbb54ef79b7ee978532bc823"); return headers; } }; requestQueue.add(jsonArrayRequest); } catch (JSONException e) { e.printStackTrace(); } 

Mi código funciona tanto para la biblioteca oficial de volley de Google como para la biblioteca de mcxiaoke

Si desea utilizar la biblioteca de Google , después de que git clone como documentación de Google, copie la carpeta android de \src\main\java\com (del proyecto Volley que clonó) a \app\src\main\java\com Su proyecto como la siguiente captura de pantalla:

Introduzca aquí la descripción de la imagen

El build.gradle debe contener lo siguiente

 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.0.1' compile 'com.google.code.gson:gson:2.3.1' } 

Si su proyecto utiliza la biblioteca de build.gradle , el build.gradle tendrá el siguiente aspecto (preste atención a las dependencies ):

 apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.0" defaultConfig { applicationId "com.example.samplevolley" minSdkVersion 16 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.0.0' compile 'com.mcxiaoke.volley:library:1.0.17' compile 'com.google.code.gson:gson:2.3' } 

Le sugiero que va a crear 2 nuevos proyectos de muestra, entonces uno va a usar la biblioteca de Google , el otro usará la biblioteca de mcxiaoke .

FIN DE LA ACTUALIZACIÓN

  String url = "http://..."; RequestQueue requestQueue = Volley.newRequestQueue(this); final String jsonString = "[\n" + " {\n" + " \"value\": 1\n" + " }\n" + "]"; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { // do something... } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // do something... } }) { @Override public byte[] getBody() { try { return jsonString.getBytes(PROTOCOL_CHARSET); } catch (UnsupportedEncodingException uee) { VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", jsonString, PROTOCOL_CHARSET); return null; } } }; requestQueue.add(jsonObjectRequest); 

La siguiente captura de pantalla es lo que recibió el servicio web del lado del servidor:

Introduzca aquí la descripción de la imagen

  • Android - cancelar solicitud de voleibol
  • Phonegap y prompt ()
  • Android Volley + JSONObjectRequest Almacenamiento en caché
  • Obtención de solicitud de contenido corporal mediante el método POST de Retrofit 2.0
  • ¿Hay alguna manera de cambiar el System User Agent de Genymotion Emulator?
  • Android Volley almacena peticiones cuando está fuera de línea
  • Hacer solicitud de volley en diferentes hilos
  • Volley error de excepción cuando el código de respuesta 304 y 200
  • Android: comprueba si la solicitud es GET o POST
  • Http obtener solicitud en Android
  • Android Volley hace 2 peticiones al servidor cuando la política de reintento se establece en 0
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.