okhttpのresponse.body().string()でハマったことメモ(ja)

はじめに

※!!この記事の内容は、時間の経過・OkHttpのアップデートとともに最新ない可能性がありますことを、ご了承ください。!!

ResponseBody code

要点

理由

前に、

Log.v(TAG, response.body().string());

の一文でエラーが起こり、その原因がわからない・・・!と軽くパニックになり、その時調べた。で、原因はbody().string()を二回呼び出していたことだったのだけれど、仕組み的にどうなっているのかわからなかったので、調べた。

okhttpとは?

Android / Javaアプリケーション向けのHTTP+SPDYクライアント。Square社製。

RequestBody

ResponseBodyはmutable型。不変ではない。

An HTTP response. Instances of this class are not immutable: the response body is a one-shot value that may be consumed only once.

上記はresponseのJavadocに書かれているサマリー。

一度 ResponseBody#.string() などでリターンすると、二回目は正しい値が帰ってこない可能性がある。と書かれています。こちらのstackoverflowにもある通り、二度目にアクセスしようとすれば、IllegalStateExceptionだったり、呼び出し箇所にによっては別のエラーを吐く場合もありそうです。

参考