2016-05-09 10 views
9

düzenleme tepkileri için addInterceptor & addNetworkInterceptor arasındaki farklar. Verileri talep ettiğimiz sunucu, farklı verileri başarıya veya hataya bağlı olarak döndürür ve nesneleri eşleştirmek zorlaşır.Android Retrofitler 2, daha önce yanıt olarak döndürülen JSON yanıtını düzenlemek için bir önleme <strong>(OkHttp 3.2 & Güçlendirme 2)</strong> uygulamaya çalışıyorum

Bir NetworkInterceptor olarak Retrofit için interceptor ekleyerek yapmaya çalışıyorum, ancak döndürülen dize hiçbir formatı yoktu. responseString

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

herhangi anlaşılabilir formatta olmadan bir dize vardı.

Normal engelleyiciye geçtikten sonra dizenin JSONObject öğesine dönüştürebileceği bir biçimi vardı.

yanıtları arasındaki farklar olan birini söyleyebilir misiniz?

bu satırın neden yeni Dize (response.body(). Bytes()); farklı içerik döndürüyor mu?

cevap

20

Farklılıklar isimlerde. NetworkInterceptor ağ düzeyinde kancalar ve yeniden deneme mantığını ve yanıtın gerçek içeriğine güvenmeyen herhangi bir şey koymak için ideal bir yerdir.

Yaptığınız şey, yanıtın içeriğine bağlıysa (sizin durumunuzda olduğu gibi), bir ApplicationInterceptor kullanarak daha yararlıdır, çünkü size yanıt vermiş olduğunuz başka herhangi bir hareketli parça tarafından işlendikten sonra yanıt verir. JSON sökücü. Aksi taktirde JSON'u, NetworkInterceptor'un içine serpiştirmek zorunda kalacaksınız.

Açıklama

Kare var interceptor her tür Böylece

interceptor diagram

oturur gösterir onların wiki üzerinde bu yararlı şeması, ApplicationInterceptor çünkü sen okunabilir bir dize almak nedeni Kare, iki önleyici tipinin amaçlarını ortadan kaldırmaya çalışıyor. NetworkInterceptor'da herhangi bir uygulamaya bağlı kararlar vermeniz gerektiğini düşünmüyorlar ve bu nedenle yanıt dizisine erişmenin kolay bir yolunu sunmuyorlar. Bunu elde etmek mümkündür, fakat dediğim gibi, yanıtın içeriğine bağlı kararlar almanızı istemezler - daha ziyade, kararları temel almanızı veya ağ durumunu veya üstbilgileri vb. Yapmanızı isterler.

ApplicationInterceptor, yanıtın içeriğine bağlı olarak kararlar almanızı istedikleri yerdir; bu nedenle, yanıtın içeriğine erişmek için daha kolay yöntemler sağlarlar. Böylece, yeniden denenmesi için bilinçli kararlar verebilmenizi veya vikilerinde ayrıntılarını verebilmenizi sağlar. , rewrite responses (hangisini yapmaya çalıştığınıza inanıyorum).

+1

Açıklamalarınız için teşekkürler, her bir aradaki engelin ne olduğu hakkında fikir sahibi olur. Ancak, neden NetworkInterceptor okunabilir bir String döndürmez ve normal önleme yapar? –

+0

@Lechon Biraz daha açıklamaya çalışmak için cevabıma daha fazla ekledim – roarster

İlgili konular