2016-05-09 1 views
9

я пытался реализовать перехватчик (OkHttp 3,2 & Дооснащаемых 2) для редактирования ответа JSON, прежде чем возвращаются в ответ. Сервер, на который мы запрашиваем данные, возвращает разные данные, зависит от успеха или ошибки и затрудняет отображение объектов.Android дооснащения 2, различие между addInterceptor и addNetworkInterceptor для редактирования ответов

Я пытался сделать это, добавив перехватчик в «Дооснащение» в качестве NetworkInterceptor, однако возвращаемая строка не имела формата.

@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 был строка без какого-либо понятного формата.

После перехода к нормальному перехватчику строка имела формат a, который был способен преобразовать в JSONObject.

Не могли бы рассказать мне кого-то, что является отличием между ответами ?

почему эта строка новая строка (response.body(). Bytes()); вернуть другой контент?

ответ

20

Различия в названиях. NetworkInterceptor подключается к сетевому уровню и является идеальным местом для установки логики повтора и всего, что не зависит от фактического содержания ответа.

Если то, что вы делаете, зависит от содержимого ответа (например, в вашем случае), использование ApplicationInterceptor является более полезным, поскольку оно дает вам ответ после его обработки любыми другими движущимися частями, которые могут иметься, например, JSON-десериализатор. В противном случае вам придется реализовать JSON, десериализируя себя внутри NetworkInterceptor, что не имеет большого смысла, учитывая, что это сделано для вас с помощью Retrofit.

Разъяснение

Square есть эта полезная схема на их виках, которая показывает, где каждый тип перехватчика сидит

interceptor diagram

Таким образом, по этой причине вы получите читаемую строку в ApplicationInterceptor потому, что Квадрат пытается уничтожить цели двух типов перехватчиков. Они не считают, что вы должны принимать какие-либо решения, зависящие от приложения, в NetworkInterceptor, и поэтому они не предоставляют вам простой доступ к строке ответа. Вы можете получить ahold, но, как я уже сказал, они не хотят, чтобы вы принимали решения, зависящие от содержания ответа, а скорее хотят, чтобы вы принимали решения на основе или состояние сети или заголовки и т. Д.

ApplicationInterceptor - это то, где они хотят, чтобы вы принимали решения в зависимости от содержания ответа, поэтому они предоставляют более простые методы для доступа к контенту ответа, чтобы вы могли принимать обоснованные решения для повторной попытки или как они подробно описывают в своей вики , rewrite responses (что я считаю тем, что вы пытаетесь сделать).

+1

Спасибо за ваше объяснение, это дает мне представление о том, что делает каждый перехватчик. Однако почему NetworkInterceptor не возвращает читаемую строку и нормальный перехватчик делает? –

+0

@Lechon Я добавил больше к своему ответу, чтобы попытаться объяснить еще несколько – roarster

Смежные вопросы