AndroidでHTTP通信（GETリクエスト）

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

１）DefaultHttpClient
２）HttpURLConnection

## ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png)１）DefaultHttpClient

```java: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.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)１）解説

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

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

## ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png)２）HttpURLConnection

```java: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.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)２）解説

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

## ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.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･ゞ いじょー。