Edited at

AndroidでのHTTP通信

More than 1 year has passed since last update.

AndroidでのHTTP通信方法をメモ目的に投稿します。

こちらを参考にしました。


注意点

以下の項目を注意してください。


パーミッション


  • インターネットを使用するため、"android.permission.INTERNET"のパーミッションを設定してください。


AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />



非同期処理


  • AndroidでHTTP通信をするには非同期処理である必要があります。エラーが発生するので注意してください。


ちょっと記述してみる

サンプルがてらちょっとプログラムを記述します。

注意点でも記載していますが、HTTP通信を行うには非同期処理が必要になります。

非同期処理ということで、"android.os.AsyncTask"を使用します。


AsyncTaskクラスを継承したクラスを作成

非同期処理のための、AsyncTaskを継承したクラスを作成します。

doInBackground(Void... params)をオーバライドしてください(オーバラードしないとエラーとなります)。

※今回はonPreExcute(), onPostExecute(String result)も使用します。


AsyncTask継承クラス

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"を使用します。


AsyncTask継承クラス

@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)"を設定してください。


AsyncTask継承クラス

con.connect(); // ①

// 本文の取得
InputStream in = con.getInputStream();
byte bodyByte[] = new byte[1024];
in.read(bodyByte);
in.close();

"bodyByte"が本文のbody部分です。

このbodyをWebブラウザで表示させることができます。


Jsonを取得する

ついでにJson取得方法もメモします。

Jsonデータを取得するにはまずレスポンスからStringデータとして抜き出します。


AsyncTask継承クラス

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にパースします。


AsyncTask継承クラス

JSONObject jsonData = new JSONObject(readSt).getJSONObject("オブジェクト名");

// 配列を取得する場合
JSONArray jsonArray = new JSONObject(readSt).getJSONArray("オブジェクト名");

後は、各データ型に合わせて取得する


AsyncTask継承クラス

// String型の場合

String st = jsonData.getString("オブジェクト名");


終わりに

いつまでこの方法がサポートされるか微妙ですが、ご参考ください。