Je travaille avec Volley, je veux faire une demande à un serveur qui me retourne un JSON dans la "couche vissible" (je peux le voir dans le navigateur web). Mon problème est que le serveur renvoie également mes informations dans les en-têtes que je dois obtenir dans mon application, mais je ne suis pas en mesure d'obtenir les en-têtes de la demande.
J'ai cherché longtemps mais je n'ai rien trouvé d'utile (Onlye ajoute des données à l'en-tête de la demande, mais ne récupère pas les données de la réponse de l'en-tête)
Tout le monde sait comment mettre cela en œuvre?
Pour obtenir les en-têtes, vous devez remplacer parseNetworkResponse()
dans votre demande.
par exemple le JsonObjectRequest
:
public class MetaRequest extends JsonObjectRequest {
public MetaRequest(int method, String url, JSONObject jsonRequest, Response.Listener
<JSONObject> listener, Response.ErrorListener errorListener) {
super(method, url, jsonRequest, listener, errorListener);
}
public MetaRequest(String url, JSONObject jsonRequest, Response.Listener<JSONObject>
listener, Response.ErrorListener errorListener) {
super(url, jsonRequest, listener, errorListener);
}
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
JSONObject jsonResponse = new JSONObject(jsonString);
jsonResponse.put("headers", new JSONObject(response.headers));
return Response.success(jsonResponse,
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
}
Ceci est un exemple de travail avec les données et les en-têtes JSONArray.
Créez d'abord votre propre implémentation de type de demande personnalisée:
public class JsonRequest extends JsonObjectRequest {
public JsonRequest(int method, String url, JSONObject jsonRequest, Response.Listener
<JSONObject> listener, Response.ErrorListener errorListener) {
super(method, url, jsonRequest, listener, errorListener);
}
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
JSONObject jsonResponse = new JSONObject();
jsonResponse.put("data", new JSONArray(jsonString));
jsonResponse.put("headers", new JSONObject(response.headers));
return Response.success(jsonResponse,
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
}
et dans votre code de demande:
JsonRequest request = new JsonRequest
(Request.Method.POST, URL_API, payload, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray data = response.getJSONArray("data");
JSONObject headers = response.getJSONObject("headers");
} catch (JSONException e) {
Log.e(LOG_TAG, Log.getStackTraceString(e));
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(LOG_TAG, Log.getStackTraceString(error));
}
});
Voir plus d'informations sur l'implémentation de votre propre demande personnalisée dans la documentation Volley Implémentation d'une demande personnalisée .