1. Qiita
  2. 投稿
  3. Android

AndroidでHTTP通信(GETリクエスト)

  • 52
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

AndroidでHTTP通信(GETリクエスト)する2つのメジャーな(?)方法をまとめてみました。例として、天気予報のURLにアクセスしてXMLデータを取得します(解析はしない)。

1)DefaultHttpClient
2)HttpURLConnection

churippu_s.png1)DefaultHttpClient

TestActivity.java
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class TestActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
    }

    // HTTPボタン押下
    public void onBtnHttpClicked(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    HttpClient httpClient = new DefaultHttpClient();
                    // 大阪の天気予報XMLデータ
                    HttpGet httpGet = new HttpGet("http://www.drk7.jp/weather/xml/27.xml");
                    HttpResponse httpResponse = httpClient.execute(httpGet);
                    String str = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
                    Log.d("HTTP", str);
                } catch(Exception ex) {
                    System.out.println(ex);
                }
            }
        }).start();
    }
}

yotsuba_s.jpg1)解説

new Thread() を使って、別スレッドでHTTP通信している理由は、そうしないと android.os.NetworkOnMainThreadException エラーが発生するためです。Android 3.0 以降、メインスレッドからはHTTPアクセスできなくなったようです。それ以外、特に難しいことはしておらず、ソースの通りです。

余談ですが、別スレッドから直接的にUI操作(TextViewなどにStringを表示など)はできないので、Handler.post() などを使う必要があります。

churippu_s.png2)HttpURLConnection

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

public class TestActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
    }

    // HTTPボタン押下
    public void onBtnHttpClicked(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 大阪の天気予報XMLデータ
                    URL url = new URL("http://www.drk7.jp/weather/xml/27.xml");
                    HttpURLConnection con = (HttpURLConnection)url.openConnection();
                    String str = InputStreamToString(con.getInputStream());
                    Log.d("HTTP", str);
                } catch(Exception ex) {
                    System.out.println(ex);
                }
            }
        }).start();
    }

    // InputStream -> String
    static String InputStreamToString(InputStream is) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line);
        } 
        br.close();
        return sb.toString();
    }
}

yotsuba_s.jpg2)解説

別スレッドでHTTP通信しているのは 1)と同じ理由です。InputStream から String へ変換するための静的関数を追加しています。そのぶん、コード量としては1)のほうがシンプルです。

churippu_s.png 参考URL

Webからダウンロードして保存する DefaultHttpClientの使用例
http://pentan.info/java/sample/file_download.html

Android組込みのHttpComponent(HttpClient)の正しい使い方といくつかのtips
http://terurou.hateblo.jp/entry/20110702/1309541200

Android HTTPで通信する(HTTPUrlConnection)
http://qiita.com/kawa106/items/9f50537a36dfa31863c3

Androidの通信処理に何使えばいいのか分からないって話。
http://quesera2.hatenablog.jp/entry/2014/11/22/021741

Javaによる、String⇔InputStreamの相互変換
http://web.plus-idea.net/2012/10/java-string-inputstream/

メインスレッド(要は画面処理)でhttpリクエスト投げようとしたら怒られた。
〜NetworkOnMainThreadException〜
http://shirusu-ni-tarazu.hatenablog.jp/entry/2013/01/20/033030

気象庁の天気予報情報を XML で配信
http://www.drk7.jp/weather/

(・o・ゞ いじょー。