iアプリTips集

HTTP通信の利用

i アプリでHTTP通信を利用してWebサーバからデータを取得するアプリを作成してみましょう。なお今回のアプリでは開発環境に加えて、エミュレータを実行する環境からアクセス可能なWebサーバを用意する必要があります。
プロジェクトの作成
  1. iαppliToolを起動し、プロジェクトの新規作成をクリックします。
  2. プロジェクト名にhttpTestと入力し、「引き続きソースファイルを作成する」にチェックが入っていることを確認して「作成」をクリックします。
  3. 次の画面で、「テンプレートを利用する」の部分のチェックを外して「作成」をクリックします。
  4. 空のファイルhttpTest.javaが作成されれば完了です。
コードの記述
  1. httpTest.javaに、以下のコードを記述します。
  2. import com.nttdocomo.ui.*;
    import com.nttdocomo.io.*;
    import javax.microedition.io.*;
    import java.io.*;
    
    public class httpTest extends IApplication {
    
        public void start() {
            /*
             * The program of IApplication is written here.
             */
            Display.setCurrent((Frame)new MainPanel());
        }
    }
    
    class MainPanel extends Panel implements SoftKeyListener{
        Label label;
    
        MainPanel() {
            setTitle("Start IApplication");
    
            //文字列のラベルを作成し、パネルに追加
            label = new Label();
            add(label);
    
            setSoftLabel(SOFT_KEY_1, "END");
            setSoftLabel(SOFT_KEY_2, "LOAD");
            setSoftKeyListener((SoftKeyListener)this);
        }
    
        public void softKeyPressed(int softKey) {
        }
        
        public void softKeyReleased(int softKey) {
            if (softKey == SOFT_KEY_1) {
                IApplication.getCurrentApp().terminate();
            }
            else if (softKey == SOFT_KEY_2) {
                try{
                    HttpConnection connection =
                        (HttpConnection)Connector.open (
                            "http:/自分で用意したサーバー名/test.txt", Connector.READ);
                         //HTTPのコネクションを開く
                         //取得する対象のサーバ上のファイルを指定する                     
                    connection.setRequestMethod ( HttpConnection.GET );
                        // GETリクエストを指定
                    connection.connect();
                        //サーバへ接続
                    int contentLength = (int)connection.getLength();
                        //取得したデータの長さを取得
                    InputStream in = connection.openInputStream();
                        //取得したデータのストリームを取得
                    byte[] data = new byte[contentLength];
                    in.read(data);
                        //byte型の配列に取得したデータを読み込む
                    connection.close();
                        //HTTPのコネクションを閉じる
                    label.setText(new String(data,"SJIS"));
                        //取得したデータをSJISとして文字列に変換し、ラベルにセットする
                }catch(Exception e){
                    System.out.println(e.toString());
                }
            }
        }
    }
    
  3. 入力が完了したらいったんビルドして、エラーが出ないことを確認してください。
ADFの設定
ADF設定をクリックし、useNetworkの項目のhttpにチェックを入れます。
※ADF設定の変更時にエラーが出た場合はこちら

エミュレータ動作環境の変更
メニューバーから設定→アプリケーション動作環境設定を開き、ネットワーク設定のタブを開きます。一番上のADFのURLの設定で、対象のファイルを設置するサーバを指定します。(例えばファイルがhttp://www.docomocup.com/test.txtならば、http://www.docomocup.com/を指定)

サーバ上へのファイルの設置
コード上で指定したサーバへ任意のファイル(今回はtest.txt)を設置します。ファイル内の文字コードは今回はSJISとします。

完了したら、ビルドして起動してみましょう。起動すると下のような画面が表示されます。
※ビルド時にエラーが出た場合はこちら
※ビルドしたが実行しても動作しない場合はこちら

左側のソフトキーを押すと、アプリケーションが終了します。
右側のソフトキーを押すと、Webサーバからファイルを読み込み、画面に表示します。
(今回はtest.txtに「テストデータです」と記述していたものとします)

例外が発生した場合、コンソールに何らかのメッセージが表示されます。代表的なものと対処法を下に示します。
  • java.lang.SecurityException: UseNetwork key not found in ADF
     ADF設定で、useNetworkにチェックを入れてください。
  • java.lang.SecurityException: Illegal host
     アプリケーション動作環境設定で指定したADFのURLが、ソースファイルで指定しているURLのサーバを指しているかどうかを確認してください。
  • com.nttdocomo.io.ConnectionException
     サーバからデータ取得に失敗しました。404、403などのHTTPエラーが帰ってきた場合、この例外が発生します。サーバ上のこのファイルにアクセスできるかどうか、ブラウザ等を利用して確認してください。
今回はコードの解説をコメントで記述しました。通信の利用は比較的難しい分野となり、さまざまな原因で問題が発生します。実行時には、問題が特定できるように状況によってそれぞれ異なる例外が発生します。問題が発生した場合は、発生した例外の内容をコンソールに表示させ、Dojaリファレンス等を利用して状況を確認し、対処法を考えてみてください。

※「iモード」「FOMA」「iアプリ」及び「i-appli」ロゴはNTTドコモの登録商標です。
※「Google」「Android」および「Android ロゴ」「Androidマーケット」とそのロゴは、Google Incの商標または登録商標です。
※「Adobe」「Flash」および「Flash Lite」は、 Adobe Systems Incorporated (アドビ システムズ社)の米国ならびにその他の国における商標または登録商標です。