OkHttpで生のjsonを出力する
OkHttpというか、retrofitの話。retrofitとそのHTTPクライアントとしてOkHttpを使っているという前提。OkHttp単体でもいけるけど。
retrofitを使ってサーバ側とjsonでやり取りをしていると、retrofitで生のjsonレスポンスを見たくても見れない。基本retrofitではコールバック内で取得できるレスポンスはjsonコンバータによってjavaのオブジェクトに変換されているために見れない。見る方法もあるのかもしれないけど探した限りはそれっぽい情報は見つからなかったし、あったとしても今のところはそう簡単に見れないっぽい。
開発中やデバッグ時は生のjsonがどう出てるのか知りたいことが結構あると思うんだけど、それが簡易に出来ないのですごく不便。なのでそこをOkHttpのInterceptorを使って解決する。retrofit側で生のresponsebodyを出すよりもretrofitの中のHTTPクライアントの方で解決するほうが早かった。というかそれしか方法がわからなかった。
実装
public class RawJsonInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Response response = chain.proceed(request); String rawJson = response.body().string(); Log.d("raw json", String.format("raw JSON response is: %s", rawJson)); return response.newBuilder().body(ResponseBody.create(response.body().contentType(), rawJson)).build(); } }
こういう感じのInterceptorを作る。特に難しいことはしていない。ただ、最後returnをしている部分でresponseを再作成しているのは一度しかbodyを読み込めないというOkHttpの仕様があるため。
あとはこれをOkHttpに噛ませればいい。
OkHttpClient client = new OkHttpClient(); client.interceptors().add(new RawJsonInterceptor());