Programming Style

メニュー

初心者がアプリ開発者になるためのプログラミング学習サイト

[Android] HttpURLConnection:GETリクエストでテキストを取得する

android-common-top

HttpURLConnectionを利用すると、HTTP通信を使った処理を実装することができます。ここでは、HttpURLConnectionでHTTPのGETリクエストを実行し、テキストを取得する方法について説明します。

 

広 告

 

目次

前提条件

動作確認端末

  • Google Nexus 7 – 5.1.1 – API22(実機)

1. インターネット接続の許可を与える

 

アプリがインターネット接続するためには、アプリに対して「ネットワークへのフルアクセス」の許可を与える必要があります。

  android-httpurlconnection-get-text-01   「ネットワークへのフルアクセス」の許可を与えるためには、マニフェストファイルの<manifest>タグ配下に以下のパーミッションを1行を追加します。  

 

src/main/AndroidManifest.xml

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

 

Note : もし許可を与えずにインターネット通信を行うとjava.net.SocketException: socket failed: EACCES (Permission denied)の例外が発生します。

 

 

 

 

2. HttpURLConnectionを使ったGETリクエストの実装例

 

まずはHttpURLConnectionを使ってHTTPのGETリクエストを実行し、テキストを取得する処理の実装例を示します。

 

HTTP通信のようなインターネット通信処理は、ThreadAsyncTaskなどを使用して別スレッド(ワーカースレッド)で実装する必要があります。今回の例では、AsyncTaskを使います。

 

HttpURLConnectionを使ったGETリクエストの実装例

import android.os.AsyncTask;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

public final class HttpGetTask extends AsyncTask<URL, Void, String> {

    @Override
    protected String doInBackground(URL... urls) {
        // 取得したテキストを格納する変数
        final StringBuilder result = new StringBuilder();
        // アクセス先URL
        final URL url = urls[0];

        HttpURLConnection con = null;
        try {
            // ローカル処理
            // コネクション取得
            con = (HttpURLConnection) url.openConnection();
            con.connect();

            // HTTPレスポンスコード
            final int status = con.getResponseCode();
            if (status == HttpURLConnection.HTTP_OK) {
                // 通信に成功した
                // テキストを取得する
                final InputStream in = con.getInputStream();
                final String encoding = con.getContentEncoding();
                final InputStreamReader inReader = new InputStreamReader(in, encoding);
                final BufferedReader bufReader = new BufferedReader(inReader);
                String line = null;
                // 1行ずつテキストを読み込む
                while((line = bufReader.readLine()) != null) {
                    result.append(line);
                }
                bufReader.close();
                inReader.close();
                in.close();
            }

        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        } catch (ProtocolException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } finally {
            if (con != null) {
                // コネクションを切断
                con.disconnect();
            }
        }
        return result.toString();
    }
}

 

上記のHttpGetTaskを呼び出し例は以下のとおりです。Activityのライフサイクルメソッドなどメインスレッドにて実装します。

 

HttpGetTaskの呼び出し例

try {
    new HttpGetTask().execute(new URL("http://xxxxxxxxxx/xxxxxx/"));
} catch (MalformedURLException e) {
    e.printStackTrace();
}

 

AsyncTask#execute()メソッドの引数には、リクエス先のURLオブジェクトを渡します。

 

 

 

3. GETリクエストする

 

以下がGETリクエストを実行するためのコードです。

 

GETリクエスト処理部分

HttpURLConnection con = null;
con = (HttpURLConnection) url.openConnection();
con.connect();

アクセス先URL情報を持ったURLオブジェクトに対してURL#openConnection()メソッドを実行すると、HttpURLConnectionオブジェクト(コネクション)を取得することができます。

 

URLConnection#connect()メソッドで実際にインターネット接続をします。

 

処理終了後は、不要なコネクションを残さないために、明示的にコネクションを切断してあげる必要があります。

 

コネクションを切断

con.disconnect();

 

 

 

4. テキストデータを読み込む

 

GETリクエストを実行し、サーバアクセスに成功した場合にのみ、読み込み処理を実行します。

 

HTTP通信でサーバアクセスが成功すると、サーバからHTTPステータスコードの200がレスポンスコードとして返ってきます。データ取得に成功したかは、このコードで判定することができます。

 

以下がレスポンスコードを判定するためのコードです。

 

レスポンスコードが成功(200)であった場合

// HTTPレスポンスコード
final int status = con.getResponseCode();
if (status == HttpURLConnection.HTTP_OK) {
    // 通信に成功した
}

 

HttpURLConnection#getResponseCode()メソッドを使うとサーバからのレスポンスコードを取得することができます。取得できたレスポンスコードが200かどうかを判定するためには、HttpURLConnectionに用意された定数を用います。

 

Nexus7 端末で上記コードを実行した場合、以下のようなリクエスト情報が送信されます。

 

Nexus7で実行した場合のTCPダンプ

GET /xxxxxxx/ HTTP/1.1
User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.1.1; Nexus 7 Build/LMY47V)
Host: xxxxxxxxxx
Connection: Keep-Alive
Accept-Encoding: gzip

 

アクセスに成功した後はテキストデータを読み込む処理を実行します。テキストデータの読み込み処理は以下のコードのとおりです。

 

テキストデータ読み込み処理

// テキストを取得する
final InputStream in = con.getInputStream();
final InputStreamReader inReader = new InputStreamReader(in);
final BufferedReader bufReader = new BufferedReader(inReader);
String line = null;
// 1行ずつテキストを読み込む
while((line = bufReader.readLine()) != null) {
    result.append(line);
}
bufReader.close();
inReader.close();
in.close();

 

テキストデータを読み込むためにはリーダー(文字ストリーム)を使います。リーダのクラスとしては、BufferdReaderを用います。リーダは以下の手順で実行されます。

 

  • 1. ストリームを開く
  • 2. データが存在する限り、読み込みを継続する
  • 3. ストリームを閉じる

 

 

リーダを生成することでストリームを開くことができます。ストリームを開いた後は、BufferdReader#readLine()を使ってテキストを読み込みます。BufferdReader#readLine()は読み込むテキストがなくなるまで1行分のString文字列を返却します。

 

読み込むデータがなくなるとnullを返却するため、それを判定し読み込み処理を終了します。

 

最後にストリームは閉じるようにします。

 

 

 

 

5. 参考URL

 

http://developer.android.com/intl/ja/reference/java/net/HttpURLConnection.html

 

広 告

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です