2016-04-05 39 views
6

Sto lavorando con Volley, voglio fare richiesta ad un server che mi restituisce un JSON nel "livello vivibile" (lo posso vedere nel browser web). Il mio problema è che il server restituisce anche le informazioni sulle intestazioni che devo inserire nella mia app, ma non riesco a ottenere le intestazioni dalla richiesta.Ottenere intestazioni da una risposta al volo

Ho cercato a lungo, ma io ho mai trovato nulla utile (Onlye aggiunta di dati per l'intestazione della richiesta, ma non ottenere i dati dalla risposta header's)

Qualcuno sa come implementare questo?

risposta

12

Per ottenere le intestazioni necessarie per sostituire parseNetworkResponse nella richiesta.

ad esempio, la 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)); 
     } 
    } 
} 
+0

Grazie !! Funziona!! Sto facendo il mio lavoro nelle intestazioni di parseNetworkResponse invece di aggiungere le intestazioni al JSONObject restituito. – Chopi

1

se la richiesta sta tornando JSON si dovrebbe essere in grado di leggere normalmente, se non il problema è dalla JSON non attraverso l'app Android

qui è un esempio di richiesta di movimentazione

RequestQueue queue = Volley.newRequestQueue(MainActivity.this); 
    JsonArrayRequest getRequest = new JsonArrayRequest(Request.Method.GET, "http://yourlink+parameters", new Response.Listener<JSONArray>() { 
     @Override 
     public void onResponse(JSONArray response) { 
      List<YourObject> reservations = null; 
      try { 

       YourObject= new ArrayList<YourObject>(); 
       for (int i = 0; i < response.length(); i++) { 
        JSONObject obj = response.getJSONObject(i); 
        YourObjectr = new YourObject(obj.getInt("id"), obj.getInt("user_id"),format.parse(obj.getString("date")), obj.getString("address"), obj.getString("description")); 
         } 

        } catch (ParseException e) { 
         e.printStackTrace(); 
        } 

       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError volleyError) { 
      if (volleyError.networkResponse != null && volleyError.networkResponse.data != null) { 
       VolleyError error = new VolleyError(new String(volleyError.networkResponse.data)); 
       volleyError = error; 
       Log.i("error", "error :" + volleyError.getMessage()); 
       try { 
        JSONObject obj = new JSONObject(volleyError.getMessage()); 
        if (obj.getString("error").equals("token_expired")) { 
         Intent i = new Intent(MainActivity.this, LoginActivity.class); 
         startActivity(i); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } else { 
       new AlertDialog.Builder(MainActivity.this) 
         .setTitle("connection problem") 
         .setMessage("check your connection") 
         .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int which) { 
          } 
         }) 
         .setIcon(android.R.drawable.ic_dialog_alert) 
         .show(); 
      } 
     } 
    }); 

    queue.add(getRequest); 
+2

Con JSONArrayRequest non è possibile ottenere le informazioni delle intestazioni (ad esempio i cookie) della richiesta http. – Chopi

0

Questo è un esempio di lavorare con dati JSONArray e le intestazioni.

Innanzitutto creare una propria implementazione richiesta di misura Tipo:

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)); 
     } 
    } 
} 

e nel tuo codice di richiesta:

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)); 
      } 
     }); 

Visualizza maggiori informazioni sull'implementazione di vostra richiesta personalizzato nella documentazione Volley Implementing a Custom Request.