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

第9回AndroidでHTTP通信を行う

前回のおさらい

前回は、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;
    }
}

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

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

HttpPost method = new HttpPost( url );

次に、Content-Typeヘッダに「application/x-www-form-urlencoded」を指定して、POSTするデータをx-www-form-urlencoded形式で送信するようにします。

paramEntity.setContentType( "application/x-www-form-urlencoded" );

以降の実装は、GETメソッドと大差ありませんが、以下のようにDefaultHttpClientのexecuteメソッドを呼び出します。

HttpResponse response = client.execute( method );

executeメソッドを実行するとレスポンスコードを返すので、正しく実行された確認します。

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

最後は、以下のように結果を文字列に変換して、returnで返しています。

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

Webサービスと連携する

HTTPプロトコルのGETとPOSTの実装方法が把握できたので、さらに歩踏み込んでWebサービスとの連携例をご紹介します。

Webサービスと連携する場合、データなどのやりとりにXMLを用いるのが一般的です。

Android OSには、XMLパーサの「SOX」が搭載されているので、これでXMLが取り扱えますが、スマートフォンにとってXMLの解析処理は重荷で、大量のデータを解析する場合は処理時間がかかります。

Android OSには、JSONパーサも搭載されているので、連携先がJSONにも対応しているのであれば、こちらを使うことをお勧めします。JSONは、XMLと比較するとデータの表現が単純なので、大量のデータでも処理負荷が低く短時間で処理が行えるので、スマートフォン向きです。また、データ表現が単純な分、プログラム単純になるので、処理速度面だけではなく、品質や保守性を向上させる意味でも有利になります。

参考として、以下にJSON形式のデータを処理している例を示します。

{"subscriptions":[{"id":"feed/http://feeds.feedburner.jp/cnet/rss","title":"CNET Japan","categories":[],"sortid":"BB146333","firstitemmsec":"1230135778214"},{"id":"feed/http://feeds.feedburner.jp/netafull","title":"[N]ネタフル","categories":[{"id":"user/13019141600096008010/label/News","label":"News"}],"sortid":"701D2BE4","firstitemmsec":"1262173951833"}]}


class JSubscriptionsHandler
{
    public List<TagObject> entries;

    public JSubscriptionsHandler() {
    }

    public boolean parse( String istring ) {
        JSONArray    jArray;

        try {
            jArray = new JSONObject( istring ).getJSONArray( "subscriptions");

            int max = jArray.length();
            entries = new ArrayList<TagObject>( max );
            for ( int i = 0; i < max; i++ )
            {
                JSONObject jsonObj = jArray.getJSONObject(i);
                
                if( jsonObj.getJSONArray("categories").length() > 0 )
                    continue;
                
                entries.add( new TagObject(
                        -1, 0,
                        jsonObj.getString("title"),
                        "0",
                        jsonObj.getString("sortid"),
                        jsonObj.getString("id") ));
            }
            return true;
        } catch (JSONException e) {
            Log.d("NetaShare", e.getMessage());
            return false;
        }
        
    }
}

まとめ

今回は、org.apache.httpを使い、以下のご説明をしました。

  • GETメソッドの実装
  • POSTメソッドの実装
  • Webサービスとの連携例

GET、POSTメソッドの実装は簡易なサンプルでしたが、共通部分が多いので実装方法を理解して頂けたと思います。

Webサービスとの連携例では、XMLではなくJSONを使うことをお勧めしました。

実際、筆者が開発に関係しているNetaShareでも、XMLからJSONに移行したことで、パフォーマンス向上が見られたので、連携先が対応しているのであればJSONがお勧めです。

おすすめ記事

記事・ニュース一覧