LoginSignup
63
62

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-03-10

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・ゞ いじょー。

63
62
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
63
62