2016-05-09 17 views
9

Próbuję zaimplementować przechwytywania (OkHttp 3,2 & modernizacyjny 2) edycji odpowiedź JSON, zanim jest zwracany jako odpowiedź. Serwer, którego żądamy, zwraca różne dane zależne od sukcesu lub błędu, co utrudnia mapowanie obiektów.Android Modernizacja 2, różnice między addInterceptor & addNetworkInterceptor o odpowiedziach edycji

Próbowałem to zrobić, dodając przechwytywacz do Retrofit jako NetworkInterceptor, jednak zwracany ciąg nie miał formatu.

@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 miał ciąg bez dowolnym formacie zrozumiałym.

Po przejściu na normalny przechwytujący, ciąg miał format a był w stanie przekonwertować do JSONObject.

Czy mogę powiedzieć mi, kim są różnice między odpowiedzi?

dlaczego ta linia nowy ciąg (response.body(). Bajty()); zwraca inną treść?

Odpowiedz

20

Różnice występują w nazwach. NetworkInterceptor haczyków na poziomie sieci i jest idealnym miejscem do umieszczenia logiki ponownej i wszystko, co nie zależy od rzeczywistej treści odpowiedzi.

Jeśli to, co robisz, zależy od treści odpowiedzi (tak jak w twoim przypadku), użycie opcji ApplicationInterceptor jest bardziej przydatne, ponieważ daje odpowiedź po przetworzeniu przez inne ruchome części, takie jak Deserializator JSON. W przeciwnym razie musiałbyś wdrożyć JSON, deserializując się wewnątrz NetworkInterceptor, co nie ma większego sensu, biorąc pod uwagę, że zostało to zrobione przez Retrofit.

Wyjaśnienie

Plac mieć ten użyteczny wykres na swojej wiki, który pokazuje, gdzie każdy typ kolektora siedzi

interceptor diagram

Zatem powód otrzymasz czytelny napis w ApplicationInterceptor dlatego Square próbuje oddzielić cele dwóch typów przechwytywaczy. Nie sądzą, że powinieneś podejmować decyzje zależne od aplikacji w NetworkInterceptor, więc nie zapewniają one łatwego dostępu do łańcucha odpowiedzi. Możliwe jest uzyskanie dostępu, ale jak już powiedziałem, nie chcą, abyś podejmował decyzje zależne od treści odpowiedzi - raczej chcą, abyś podejmował decyzje w oparciu o stan sieci, nagłówki itp.

Tam, gdzie zależy Ci na podejmowaniu decyzji w zależności od treści odpowiedzi, zapewniają one łatwiejsze metody dostępu do treści odpowiedzi, dzięki czemu możesz podejmować świadome decyzje, aby spróbować ponownie, lub gdy są one szczegółowo opisane na stronie wiki. , rewrite responses (co, jak sądzę, jest tym, co próbujesz zrobić).

+1

Dziękuję za wyjaśnienia, daje mi to pojęcie o tym, co robi każdy przechwytujący. Dlaczego jednak NetworkInterceptor nie zwraca czytelnego ciągu znaków i normalnego przechwytywacza? –

+0

@Lechon Dodałem więcej do mojej odpowiedzi, aby spróbować wyjaśnić więcej – roarster

Powiązane problemy