2016-05-09 64 views
9

ho cercato di implementare un intercettore (OkHttp 3,2 & Retrofit 2) per la modifica della risposta JSON prima viene restituito come risposta. Il server che richiediamo dati restituisce dati diversi dipende dal successo o dall'errore e rende difficile mappare gli oggetti.Android Retrofit 2, le differenze tra addInterceptor & addNetworkInterceptor per l'editing risposte

Stavo cercando di farlo aggiungendo l'intercettore a Retrofit come NetworkInterceptor, tuttavia la stringa restituita non aveva alcun formato.

@Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 

     Response response = chain.proceed(request); 
     try { 

      final String responseString = new String(response.body().bytes()); 

      LOGD("OkHttp-NET-Interceptor", "Response: " + responseString); 

      String newResponseString = editResponse(responseString); 

      LOGD("OkHttp-NET-Interceptor", "Response edited: " + newResponseString); 
      return response.newBuilder() 
        .body(ResponseBody.create(response.body().contentType(), newResponseString)) 
        .build(); 

     }catch (Exception ex){ 
      return response; 
     } 
    } 

responseString aveva una stringa senza qualsiasi formato comprensibile.

Dopo il passaggio al normale intercettore, la stringa aveva il formato a che era in grado di convertire in JSONObject.

Potrebbe dirmi qualcuno quali sono le differenze tra le risposte ?

perché questa riga nuova stringa (response.body(). Bytes()); restituiscono contenuti diversi?

risposta

20

Le differenze sono nel nome. NetworkInterceptor si aggancia a livello di rete ed è il luogo ideale in cui inserire la logica dei tentativi e tutto ciò che non si basa sul contenuto effettivo della risposta.

Se quello che fai dipende dal contenuto della risposta (come nel tuo caso), utilizzando un ApplicationInterceptor è più utile, in quanto ti dà la risposta dopo che è stato elaborato da tutte le altre parti in movimento si può avere ad esempio una Deserializzatore JSON. Altrimenti dovresti implementare il JSON deserializzando te stesso all'interno del NetworkInterceptor che non ha molto senso considerando che è fatto per te da Retrofit.

Chiarimento

Piazza avere questo diagramma utile sul proprio wiki che mostra dove ogni tipo di interceptor siede

interceptor diagram

Così, la ragione si riceve una stringa leggibile nel ApplicationInterceptor è perché Square sta cercando di disaccoppiare gli scopi dei due tipi di intercettatore. Non pensano che dovresti prendere decisioni dipendenti dall'applicazione nello NetworkInterceptor, e quindi non forniscono un modo semplice per accedere alla stringa di risposta. È possibile ottenere, ma come ho detto, non vogliono che tu prenda decisioni che dipendono dal contenuto della risposta, ma piuttosto che tu voglia prendere decisioni in base allo stato della rete, o intestazioni ecc.

Il ApplicationInterceptor è il punto in cui desidera che le decisioni dipendano dal contenuto della risposta, in modo da fornire metodi più semplici per accedere al contenuto della risposta in modo da poter prendere decisioni informate per riprovare o mentre descrivono nel proprio wiki , rewrite responses (che credo sia quello che stai cercando di fare).

+1

Grazie per la tua spiegazione, mi dà un'idea di cosa fa ogni intercettore. Tuttavia, perché NetworkInterceptor non restituisce una stringa leggibile e il normale intercettore funziona? –

+0

@Lechon Ho aggiunto altro alla mia risposta per provare a spiegare un po 'di più – roarster