Android volley JsonObjectRequest que no devuelve ningún cuerpo sólo 200
Cómo hacer una solicitud JSON en volley donde necesito enviar un encabezado de autenticación y un objeto JSON en el cuerpo y espero sólo un código de estado 200 respuesta
JsonObjectRequest request = new JsonObjectRequest( method, url, myJsonObject, responseListener, errorListener) { @Override public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> headers = new HashMap<String, String>(); String creds = String.format("%s:%s", login, password); String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT); headers.put("Authorization", auth); return headers; } }; new Response.Listener<String>(){ @Override public void onResponse(String response) { Toast.makeText(getActivity(), response, 1000).show(); }
He intentado diferentes tipos de oyentes de respuesta con cadena o objeto JSON, objeto, pero siempre hay un error: android volley org.json.JSONException: Fin de la entrada en el carácter 0 de
- Cómo comprimir JSON con gzip en Rails para Android?
- Cómo analizar esta matriz JSON anidada en android
- Creación de un WebService ASP.net que devuelve JSON en lugar de XML
- Devolver una gota con json
- Tratando de devolver datos de PHP con JSON a Android ...
¿O hay algún otro tipo de solicitud en volley que apoya y json objeto y autenticación encabezado en el cuerpo y la respuesta es sólo un código de estado http?
- Que cliente es mejor HttpURLConnection o HttpClient en android?
- Cálculo de la distancia entre la ubicación del usuario y la ubicación del restaurante vía json (url)
- Org.json.JSONException: Fin de entrada en el carácter 0 de
- Widget de conexión de Android facebook: org.json.JSONException
- Cómo convertir el objeto de cursor en XML o JSON en android
- Mapping de Jackson Objeto o lista de objetos dependiendo de la entrada de json
- Java.lang.IllegalArgumentException: Caracteres ilegales en la consulta en índice 59
- Cómo obtener malformado JSON en Retrofit 2
Sé que es una vieja pregunta, pero pensé que aún responder a esto como mi respuesta podría ayudar a la gente en el futuro –
Necesita crear una clase personalizada que extienda la clase Solicitud y en esa clase anule estos métodos
@Override protected Response parseNetworkResponse(NetworkResponse response) { return Response.success(response.statusCode, HttpHeaderParser.parseCacheHeaders(response)); } @Override protected void deliverResponse(Integer statusCode) { mListener.onResponse(statusCode); }
Este es el corazón y el alma de la clase.
Para el código completo y la explicación, echa un vistazo a mi blog sobre el tema –
Cómo obtener un estado de respuesta del servidor 200 de Android Volley library
Enlace 1
Espero que ayude, gracias
Gracias a Varundroid ya Itai Hanski. Es correcto, sólo tiene que subclase el JsonObjectRequest.
Para mayor comodidad aquí está mi anulación:
public class MyJsonObjectRequest extends JsonObjectRequest { @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); // here's the new code, if jsonString.length() == 0 don't parse if (jsonString.length() == 0) { return Response.success(null, HttpHeaderParser.parseCacheHeaders(response)); } // end of patch 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)); } } }
Así que sólo uso que en lugar de JsonObjectRequest
. No es demasiado bonita, ni demasiado fea.
JsonObjectRequest
se utiliza cuando espera que la respuesta de red sea un objeto JSON. Puesto que usted no está esperando eso, usted no debe usarlo.
Volley viene con algunos tipos populares predefinidos de solicitudes de facilidad de uso, pero siempre puedes crear tu propio. Sugiero hacer una solicitud personalizada basada en JsonObjectRequest
, pero con una implementación diferente del método parseNetworkResponse()
que no espera que la respuesta sea un objeto JSON, ya que no está recibiendo uno. Puede agregar cualquier otro cambio que necesite allí.
No es necesario crear una clase personalizada que extienda Solicitud como @varundroid declarado. Sólo puede anular el método parseNetworkResponse
lugar del método onResponse
y devolver la respuesta de éxito con JSONObject vacío ().
El siguiente es el código que estoy usando para superar el mismo problema que enfrentas. Espero que esto te ayude también
@Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { if (response != null && response.data.length == 0) return Response.success(new JSONObject(), null); else return super.parseNetworkResponse(response); }
- Android – limitar el número de fragmentos en backStack?
- Android Cómo elegir una publicación con facebook 3.0 sdk