AndroidでのHTTP通信

  • 50
    いいね
  • 0
    コメント

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("オブジェクト名");

終わりに

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