[Android] HTTPリクエストの状態を確認したい

2015.07.07

HTTPリクエストの状態を確認したい

APIの通信処理などを実装していると、リクエストヘッダーやレスポンスヘッダーなどの情報を確認したいということはよくあると思います。 基本的にはログに出力するなどして対応すると思いますが、Facebookが公開している stetho というライブラリがとてもいい感じだったので紹介したいと思います。

stetho導入

stethoのライブラリと、通信用ライブラリとして今回はretrofitのライブラリを導入します。

compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.facebook.stetho:stetho:1.0.0'
compile 'com.facebook.stetho:stetho-okhttp:1.1.1'

実装

stethoの初期化

Applicationクラスでstethoの初期化処理を記述します

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        Stetho.initialize(Stetho.newInitializerBuilder(this)
                .enableDumpapp(Stetho.defaultDumperPluginsProvider(this))
                .enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this))
                .build());
    }

}

通信処理

今回は、例として http://express.heartrails.com/ から都道府県名の一覧を取得する通信処理を実装したいと思います。 ※retrofitの使用方法については省略します。

 

JSONデータで返却されるので、パース用のモデルを作成します。

public class SampleModel {

    public List<Prefecture> response;

    public class Prefecture{
        public String prefecture;
    }

}

 

retrofitのインターフェースを作成します。

public interface SampleApi {

    @GET("/api/json")
    void get(@Query("method") String method, Callback<SampleModel> callback);

}

 

OkHttpClient の networkInterceptors に StethoInterceptor を差し込んで、retrofit の RestAdapter で使用する Client として設定します。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button)findViewById(R.id.request_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                
                OkHttpClient client = new OkHttpClient();
                client.networkInterceptors().add(new StethoInterceptor());

                RestAdapter restAdapter = new RestAdapter.Builder()
                        .setEndpoint("http://express.heartrails.com/")
                        .setClient(new OkClient(client))
                        .setLogLevel(RestAdapter.LogLevel.FULL)
                        .build();

                restAdapter.create(SampleApi.class).get("getPrefectures", new Callback<SampleModel>() {
                    @Override
                    public void success(SampleModel sampleModel, Response response) {
                        Toast.makeText(MainActivity.this, "success", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void failure(RetrofitError error) {
                        Toast.makeText(MainActivity.this, "failure", Toast.LENGTH_SHORT).show();
                    }
                });

            }
        });
    }

}

以上で準備完了です。

確認する

android端末をUSBデバックで接続して、アプリを起動します。 "chrome://inspect" から Chrome DevTool の Device を選択すると、接続している端末とstethoが導入されているアプリ名が表示されるので、inspect をクリックしてデベロッパーツールを表示します。

スクリーンショット 2015-07-07 20.26.57

あとは、端末から通信処理を実行すると、以下の様にMethodやStatus、Timelineなどが視覚的に確認できます!

スクリーンショット 2015-07-07 20.31.45

さらには、リクエストヘッダーやレスポンスヘッダー、レスポンス内容なども簡単に確認することができます。

スクリーンショット 2015-07-07 20.32.45

まとめ

簡単に実装でき実際のリクエスト内容などが視覚的に確認できて,とても便利だと思いました。 また、SQLiteのDB情報も確認できるようなので、今度チャレンジしてみたいと思います。

以上です。

参考

StethoでAndroidのNetwork Performanceを見る