Edited at

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

More than 3 years have passed since last update.

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

1)DefaultHttpClient

2)HttpURLConnection


1)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();
}
}



1)解説

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

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


2)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();
}
}



2)解説

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


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