AndroidでのHTTP通信方法をメモ目的に投稿します。
こちらを参考にしました。
#注意点
以下の項目を注意してください。
####パーミッション
- インターネットを使用するため、"android.permission.INTERNET"のパーミッションを設定してください。
<uses-permission android:name="android.permission.INTERNET" />
####非同期処理
- AndroidでHTTP通信をするには非同期処理である必要があります。エラーが発生するので注意してください。
#ちょっと記述してみる
サンプルがてらちょっとプログラムを記述します。
注意点でも記載していますが、HTTP通信を行うには非同期処理が必要になります。
非同期処理ということで、"android.os.AsyncTask"を使用します。
##AsyncTaskクラスを継承したクラスを作成
非同期処理のための、AsyncTaskを継承したクラスを作成します。
doInBackground(Void... params)をオーバライドしてください(オーバラードしないとエラーとなります)。
※今回はonPreExcute(), onPostExecute(String result)も使用します。
public class HttpResponsAsync extends AsyncTask<Void, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// doInBackground前処理
}
@Override
protected String doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// doInBackground後処理
}
}
##doInBackground内に通信処理を記述する
では通信処理を記述します。昔は"HttpPost(HttpGet)"を使用していましたが、非推奨になったんで"HttpURLConnection"を使用します。
@Override
protected String doInBackground(Void... params) {
HttpURLConnection con = null;
URL url = null;
String urlSt = "http://sample.jp";
try {
// URLの作成
url = new URL(urlSt);
// 接続用HttpURLConnectionオブジェクト作成
con = (HttpURLConnection)url.openConnection();
// リクエストメソッドの設定
con.setRequestMethod("POST");
// リダイレクトを自動で許可しない設定
con.setInstanceFollowRedirects(false);
// URL接続からデータを読み取る場合はtrue
con.setDoInput(true);
// URL接続にデータを書き込む場合はtrue
con.setDoOutput(true);
// 接続
con.connect(); // ①
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
①の時点で接続を開始しています。このメソッドが実行された時点で、サーバーからレスポンスが返ってきます。
##本文を取得する
返ってきたレスポンスから本文を取得します。
取得する場合は**"setDoInput(true)"**を設定してください。
con.connect(); // ①
// 本文の取得
InputStream in = con.getInputStream();
byte bodyByte[] = new byte[1024];
in.read(bodyByte);
in.close();
"bodyByte"が本文のbody部分です。
このbodyをWebブラウザで表示させることができます。
##Jsonを取得する
ついでにJson取得方法もメモします。
Jsonデータを取得するにはまずレスポンスからStringデータとして抜き出します。
con.connect(); // ①
InputStream in = con.getInputStream();
String readSt = readInputStream(in);
public String readInputStream(InputStream in) throws IOException, UnsupportedEncodingException {
StringBuffer sb = new StringBuffer();
String st = "";
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
while((st = br.readLine()) != null)
{
sb.append(st);
}
try
{
in.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return sb.toString();
}
出来たデータをJsonにパースします。
JSONObject jsonData = new JSONObject(readSt).getJSONObject("オブジェクト名");
// 配列を取得する場合
JSONArray jsonArray = new JSONObject(readSt).getJSONArray("オブジェクト名");
後は、各データ型に合わせて取得する
// String型の場合
String st = jsonData.getString("オブジェクト名");
#終わりに
いつまでこの方法がサポートされるか微妙ですが、ご参考ください。