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:
- Cómo comunicarse desde php a Android
- Android enviando solicitudes de correos a django servidor csrf fallando
- Android usb requestWait no volver
- Facebook cómo enviar solicitud de autorización de solicitud a los amigos?
- Interceptar solicitudes POST en un WebView
// 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
- ¿Apoya Android varias solicitudes HTTP al mismo tiempo?
- Android envía la solicitud de correos https al servidor sin métodos desaconsejados
- Android httprequest java.net.UnknownHostException
- Uso de la biblioteca AQuery con la solicitud PUT y StringEntity (String)
- ¿Cómo enviar un objeto JSON a través de HttpClient Request con Android?
- Glide - agregar cabecera a la solicitud
- Cómo obtener el código de estado en la respuesta correcta Volley Android
- Los anuncios de Google con varios tamaños de anuncio de DFP dan error
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:
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:
- ¿Android Beacon Library realmente admite la exploración en segundo plano?
- No se pudo encontrar la clase 'com.google.android.gms.location.internal.ParcelableGeofence referenciada desde el método glt.a