2016-05-09 1 views
9

私は前にレスポンスとして返されるJSONレスポンスを編集するためのインターセプタ(OkHttp 3.2 &レトロフィット2)を実装しようとしてきました。データを要求するサーバーは、成功またはエラーに応じて異なるデータを返すため、オブジェクトをマップするのが難しくなります。Androidのレトロフィット2、編集応答のためのaddInterceptor&addNetworkInterceptorとの違い

RetrofitにNetworkInterceptorとしてインターセプタを追加していましたが、返される文字列にはフォーマットがありませんでした。 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; 
     } 
    } 

は、任意の分かりやすいフォーマットせずに文字列を持っていました。

通常のインターセプタに変更した後、文字列の形式はJSONObjectに変換できました。

の回答はとなりますか?

なぜこの行新しい文字列(response.body()。バイト());別のコンテンツを返しますか?

答えて

20

名前には違いがあります。 NetworkInterceptorはネットワークレベルでフックインし、リトライロジックと実際の応答内容に依存しないものを置くのに理想的な場所です。

回答の内容(あなたの場合のような)によっては、ApplicationInterceptorを使用すると、他の動いている部品で処理された後で応答が得られます。 JSONデシリアライザ。それ以外の場合は、NetworkInterceptorの中で自分自身を逆シリアル化するJSONを実装する必要があります。これは、Retrofitによって実現されたと考えるとあまり意味がありません。

明確化

スクエアは、インターセプタの各タイプが

interceptor diagram

を座っている場所を示して自分のwikiにこの便利な図はこのように、あなたがApplicationInterceptorで読める文字列を受け取る理由があるためである持っていますスクエアは、2つのインターセプタタイプの目的を分離しようとしています。彼らはNetworkInterceptorでアプリケーション依存の意思決定を行うべきではないと考えているので、応答文字列に簡単にアクセスする方法はありません。私が言ったように、彼らはあなたが応答の内容に依存する決定をすることを望んでいません - むしろ、彼らはあなたが決定またはネットワーク状態、またはヘッダーなどを基に決定してほしい

ApplicationInterceptorは、レスポンスの内容に応じて決定する必要があるため、レスポンスの内容にアクセスするための簡単な方法を提供し、情報に基づいた意思決定を行うことができます。 、rewrite responses(私はあなたがやろうとしていると信じています)。

+1

あなたの説明をお寄せいただき、ありがとうございました。しかし、NetworkInterceptorが読み込み可能な文字列を返さず、通常のインターセプタが返すのはなぜですか? –

+0

@レオン私はいくつかの詳細を説明しようと私の答えに追加しました – roarster

関連する問題