volleyball voleibol playa para juegos gratis descargar championship android character-encoding android-volley

android - voleibol - descargar volleyball championship



¿Por qué la cadena de respuesta de volley utiliza una codificación diferente a la de los encabezados de respuesta? (5)

Al realizar una solicitud de volea (ya sea StringRequest o JsonObjectRequest ), utilizando la pila OkHttp, la codificación de la cadena de respuesta se establece en ISO-8995-1, que es la codificación predeterminada. La respuesta tiene un encabezado: content-type=text/html; charset=utf-8 content-type=text/html; charset=utf-8 , que debe ser detectado. ¿Por qué no lo es?


Ambos tipos de solicitud llaman a HttpHeaderParser.parseCharset , que es capaz de determinar el conjunto de caracteres de los encabezados. Sin embargo, requiere que el encabezado sea Content-Type , no content-type : distingue entre mayúsculas y minúsculas. (No estoy seguro del comportamiento si utilizo el HurlStack predeterminado, es posible que esta sea una diferencia de detalles de implementación con la pila OkHttp).

Solución 1: copie el tipo de solicitud original, pero anule manualmente el conjunto de caracteres

Solución 2: copie el tipo de solicitud original, pero obligue a existir el encabezado esperado

import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Response; import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; import com.android.volley.toolbox.HttpHeaderParser; import com.android.volley.toolbox.JsonRequest; import org.json.JSONException; import org.json.JSONObject; import java.io.UnsupportedEncodingException; public class JsonUTF8Request extends JsonRequest<JSONObject> { public JsonUTF8Request(int method, String url, JSONObject jsonRequest, Listener<JSONObject> listener, ErrorListener errorListener) { super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, errorListener); } @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { // solution 1: String jsonString = new String(response.data, "UTF-8"); // solution 2: response.headers.put(HTTP.CONTENT_TYPE, response.headers.get("content-type")); String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); // 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)); } } }


Cambie el método de GET a POST para el soporte UTF-8

JsonObjectRequest jsonReq = new JsonObjectRequest(Method.POST, URL_FEED, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { VolleyLog.d(TAG, "Response: " + response.toString()); Log.d("SHY", "Response: " + response.toString()); if (response != null) { parseJsonFeed(response); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); } });

. . . .


Gracias @Simon Heinen. Basado en su respuesta, escribí una función.

private void addEncodeing2Request(NetworkResponse response) { try { String type = response.headers.get(HTTP.CONTENT_TYPE); if (type == null) { //Content-Type: Log.d("RVA", "content type was null"); type = TYPE_UTF8_CHARSET; response.headers.put(HTTP.CONTENT_TYPE, type); } else if (!type.contains("charset")) { //Content-Type: text/plain; Log.d("RVA", "charset was null, added encode utf-8"); type += ";" + TYPE_UTF8_CHARSET; response.headers.put(HTTP.CONTENT_TYPE, type); } else { //nice! Content-Type: text/plain; charset=utf-8'' Log.d("RVA", "charset is " + type); } } catch (Exception e) { e.printStackTrace(); } }

Uso:

protected Response<String> parseNetworkResponse(NetworkResponse response) { addEncodeing2Request(response); return super.parseNetworkResponse(response); }

Además, sobrescribir getParamsEncoding () también puede funcionar.

protected String getParamsEncoding() { return "utf-8"; }


Primero, muchas gracias a @mjibson por las 2 soluciones que publicaste aquí, tuve un problema similar, en mi caso, el tipo de contenido siempre faltaba, así que hice lo siguiente:

protected static final String TYPE_UTF8_CHARSET = "charset=UTF-8"; @Override protected Response<String> parseNetworkResponse( NetworkResponse response) { try { String type = response.headers.get(HTTP.CONTENT_TYPE); if (type == null) { Log.d(LOG_TAG, "content type was null"); type = TYPE_UTF8_CHARSET; response.headers.put(HTTP.CONTENT_TYPE, type); } else if (!type.contains("UTF-8")) { Log.d(LOG_TAG, "content type had UTF-8 missing"); type += ";" + TYPE_UTF8_CHARSET; response.headers.put(HTTP.CONTENT_TYPE, type); } } catch (Exception e) { //print stacktrace e.g. } return super.parseNetworkResponse(response); }

Solo quería compartir esto para que otros se topen con un problema similar. también es importante leer el método parseCharset en https://android.googlesource.com/platform/frameworks/volley/+/master/src/com/android/volley/toolbox/HttpHeaderParser.java para saber por qué funciona esto


Reemplace el método parseNetworkResponse de la clase Request<T> .
Puedes hacer así:

/** * A canned request for retrieving the response body at a given URL as a String. */ public class StringRequest extends Request<String> { private final Listener<String> mListener; /** * the parse charset. */ private String charset = null; /** * Creates a new request with the given method. * * @param method the request {@link Method} to use * @param url URL to fetch the string at * @param listener Listener to receive the String response * @param errorListener Error listener, or null to ignore errors */ public StringRequest(int method, String url, Listener<String> listener, ErrorListener errorListener) { super(method, url, errorListener); mListener = listener; } /** * Creates a new GET request. * * @param url URL to fetch the string at * @param listener Listener to receive the String response * @param errorListener Error listener, or null to ignore errors */ public StringRequest(String url, Listener<String> listener, ErrorListener errorListener) { this(Method.GET, url, listener, errorListener); } /** * Creates a new GET request with the given Charset. * * @param url URL to fetch the string at * @param listener Listener to receive the String response * @param errorListener Error listener, or null to ignore errors */ public StringRequest(String url, String charset, Listener<String> listener, ErrorListener errorListener) { this(Method.GET, url, listener, errorListener); this.charset = charset; } @Override protected void deliverResponse(String response) { mListener.onResponse(response); } @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { String parsed; try { if(charset != null) { parsed = new String(response.data, charset); } else { parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); } } catch (UnsupportedEncodingException e) { parsed = new String(response.data); } return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); } /** * @return the Parse Charset Encoding */ public String getCharset() { return charset; } /** * set the Parse Charset Encoding * @param charset */ public void setCharset(String charset) { this.charset = charset; } }