AndroidでHTTPを使ったネットワーク接続

AndroidのアプリからHTTPプロトコルを使ってサーバーとの通信を行う方法についてまとめてみようと思います。

 

HTTP通信を行うには java.net.HttpURLConnection クラスを使って実装していきます。


パーミッション

アプリがネットワーク接続を行なう為には、パーミッションの設定が必要です。

AndroidManifest.xml へネットワークアクセスを許可する為の android.permission.INTERNET を記述します。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xxx.xxx.xxxxx">

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

    <application
        android:name=".MainActivity"
            :
            :
    </application>
</manifest>

ネットワークアクセスは非同期で

ネットワークへアクセスする処理は、メインスレッドとは別のスレッドで非同期に実行しなけれなりません。(Androidバージョン4くらいからそうなりました)

メインスレッドから実行しようとすると android.os.NetworkOnMainThreadException という例外が起きてしまいます。

 

非同期で処理を行うには android.content.AsyncTaskLoader クラスを使うのが良さそうです。

 

使い方については

 Androidの非同期処理はAsyncTaskよりもAsyncTaskLoaderで や

 Androidの非同期処理でAsyncTaskLoaderを使う

を参考にしてみてください。


HTTP通信処理の実装 (GET)

    try {
        String siteURL = "http://xxxx.xxx/test.aspx";
        String sitePrm = "value1=aaa&value2=bbb";

        URL url = new URL(siteURL + "?" + sitePrm);
        HttpURLConnection con = (HttpURLConnection)url.openConnection();

        con.setDoInput(true);
        con.setDoOutput(false);
        con.setRequestMethod("GET");
        con.connect();
        
        InputStream is;
        int code = con.getResponseCode();
        switch (code) {
            case 200:
                is = con.getInputStream();
                    :
                    :
                break;

            case 403:
                is = con.getErrorStream();
                    :
                    :
                break;

            default:
                break;
        }
    }
    catch (Exception e) {
    }

URLクラスのopenConnectionメソッドを使ってHttpURLConnectionオブジェクトを取得します。(6行目)

 

接続先サーバーからデータを取得する場合 setDoInputメソッドに true をセットします。(8行目)

接続先サーバーへデータを送信する場合 setDoOutputメソッドに true をセットしますが、この例ではGETなので false をセットしています。(9行目)

 

リクエストメソッドを setRequestMethodメソッドで指定します。(10行目)

※setRequestMethodをGETにしてもsetDoOutputをtrueにするとPOSTで送信されてしまう?場合があるようなので注意が必要です

 

準備が整ったら connectメソッドを呼び出して接続を開始します。(11行目)

 

getResponseCodeメソッドを使うとHTTPのステータスコードが取得できます。(14行目)

 

通信に成功したら getInputStreamメソッドを使ってデータを取り出します。(17行目)

通信が失敗した場合 getErrorStreamメソッドでエラー情報などのサーバーが返すデータを取り出す事が出来ます。(23行目)


HTTP通信処理の実装 (POST)

    try {
        String siteURL = "http://xxxx.xxx/test.aspx";
        String sitePrm = "value1=aaa&value2=bbb";

        URL url = new URL(siteURL);
        HttpURLConnection con = (HttpURLConnection)url.openConnection();

        con.setDoInput(true);
        con.setDoOutput(true);
        con.setRequestMethod("POST");
        con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream());
        out.write(sitePrm);
        out.close();
        con.connect();
        
        InputStream is;
        int code = con.getResponseCode();
        switch (code) {
            case 200:
                is = con.getInputStream();
                    :
                    :
                break;

            case 403:
                is = con.getErrorStream();
                    :
                    :
                break;

            default:
                break;
        }
    }
    catch (Exception e) {
    }

基本的なところはGETの時と同じです。

接続先サーバーへデータを送信する為 setDoOutputメソッドに true をセットします。(9行目)

送信するデータの Content-Type を setRequestPropertyメソッドを使って指定しましょう。

(11行目)

getOutputStreamメソッドで取得できる OutputStream へ送信データを書き込みます。

(12~14行目)