LoginSignup
83
85

More than 5 years have passed since last update.

AndroidでのHTTP通信

Last updated at Posted at 2015-10-27

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

終わりに

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

83
85
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
83
85