世界を目指せ!Androidアプリ開発入門

第9回 AndroidでHTTP通信を行う

この記事を読むのに必要な時間:およそ 3.5 分

前回のおさらい

前回は,Android OSに搭載されているリレーショナルデータベースシステム「SQLite」に関して,以下を学びました。

具体的には,

  • テーブルの作成
  • アップグレード処理
  • レコードの追加
  • レコードの更新
  • レコードの読み出し

の説明しました。使いこなすには,SQL文の学習が必要になりますが,SQLiteのライブラリは簡単に使うことができるので,サンプルプログラムを修正するなどして,自分のものにしてください。

ネットへ接続する

スマートフォンは手軽にネットワークへ接続できるので,Webサービスと連携したり,複数のWebサービスをマッシュアップする等,ネットワークへの接続を前提とするアプリを開発するケースが多くなるはずです。そこで,今回は,ネットワークへの接続方法をご説明します。

ネットワークへの接続と言っても様々ありますが,今回は,最も汎用性の高いHTTP通信を取り上げます。

利用するライブラリ

Android OSでHTTP通信を行う場合,android.net.http,org.apache.httpなど,複数のクラスライブラリから好みのものが使えますが,今回は,org.apache.httpを使って,HTTPプロトコルのGET, POSTメソッドの実装方法をご紹介します。

アプリからインターネットへ接続する場合は,AndroidManifest.xmlに以下の記述を追加して,インターネット接続への許可を与えてください。

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

GETメソッドの実装

以下は,GETメソッドの実装例です。

doGetメソッドは,第一引数にURLを指定して実行すると,実行結果を文字列で返します。

public String doGet( String url )
{
    try
    {
        HttpGet method = new HttpGet( url );

        DefaultHttpClient client = new DefaultHttpClient();

        // ヘッダを設定する
        method.setHeader( "Connection", "Keep-Alive" );
        
        HttpResponse response = client.execute( method );
        int status = response.getStatusLine().getStatusCode();
        if ( status != HttpStatus.SC_OK )
            throw new Exception( "" );
        
        return EntityUtils.toString( response.getEntity(), "UTF-8" );
    }
    catch ( Exception e )
    {
        return null;
    }
}

では,詳しく見ていきます。

まずは,HttpGetクラスの第一引数にURLを指定してクラスを生成して,GETメソッドを使用する準備を行います。

HttpGet method = new HttpGet( url );

続いて,DefaultHttpClientクラスを生成します。

DefaultHttpClient client = new DefaultHttpClient();

GETメソッドを実行するには,DefaultHttpClientのexecuteメソッドを呼び出します。

第一引数には,最初に生成したHttpGetを指定します。

HttpResponse response = client.execute( method );

executeメソッドを実行すると,レスポンスコードを返します。

以下のように返値を評価し,正しく実行された確認します。例では,正しく実行されなかったらthrowしています。

int status = response.getStatusLine().getStatusCode();
if ( status != HttpStatus.SC_OK )
    throw new Exception( "" );

executeメソッドが正しく実行されたら,以下のように結果を文字列に変換して,returnで返しています。

return EntityUtils.toString( response.getEntity(), "UTF-8" );

POSTメソッドの実装

POSTメソッドの実装は,以下のようになります。

doPostメソッドは,第一引数にURL,第二引数にパラメーターを指定して実行すると,結果を文字列で返します。

public String doPost( String url, String params )
{
    try
    {            
        HttpPost method = new HttpPost( url );
        
        DefaultHttpClient client = new DefaultHttpClient();
        
        // POST データの設定
        StringEntity paramEntity = new StringEntity( params );
        paramEntity.setChunked( false );
        paramEntity.setContentType( "application/x-www-form-urlencoded" );
        method.setEntity( paramEntity );
        
        HttpResponse response = client.execute( method );
        int status = response.getStatusLine().getStatusCode();
        if ( status != HttpStatus.SC_OK )
            throw new Exception( "" );
        
        return EntityUtils.toString( response.getEntity(), "UTF-8" );
    }
    catch ( Exception e )
    {
        return null;
    }
}

著者プロフィール

傍島康雄(そばじまやすお)

5月30日生まれ。

モバイルデバイスが大好物。それで動くアプリの開発に喜びを感じている。スマートフォン前夜のWindows Mobile,PalmOSのアプリに情熱を傾けていたが,最近は停滞気味でコードを書くよりも文章を書く機会が多くなっており,文章を書くのも,プログラミングと同じくらい奥深い作業だと感じている。

ブログ:http://yasuos.com/blog/

コメント

  • android 4.0.3

    上記のHTTP通信ですが、android2.3.3のAVDでは動作しましたが。4.0.3のAVDでは動作しませんでした。
    androidのバージョンによって動作が異なるのでしょうか?

    Commented : #1  がわっち (2012/06/15, 15:37)

コメントの記入