AndroidでのHTTP通信

AndroidでのHTTP通信方法をメモ目的に投稿します。
[こちら](http://techbooster.jpn.org/andriod/application/6812/)を参考にしました。

#注意点
以下の項目を注意してください。
####パーミッション
- インターネットを使用するため、"android.permission.INTERNET"のパーミッションを設定してください。

```java:AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
```

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


#ちょっと記述してみる
サンプルがてらちょっとプログラムを記述します。
注意点でも記載していますが、HTTP通信を行うには非同期処理が必要になります。
非同期処理ということで、"android.os.AsyncTask"を使用します。

##AsyncTaskクラスを継承したクラスを作成
非同期処理のための、AsyncTaskを継承したクラスを作成します。
doInBackground(Void... params)をオーバライドしてください（オーバラードしないとエラーとなります）。
※今回はonPreExcute(), onPostExecute(String result)も使用します。

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

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

```java: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データとして抜き出します。

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

```java:AsyncTask継承クラス
JSONObject jsonData = new JSONObject(readSt).getJSONObject("オブジェクト名");
// 配列を取得する場合
JSONArray jsonArray = new JSONObject(readSt).getJSONArray("オブジェクト名");
```

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

```java:AsyncTask継承クラス
// String型の場合
String st = jsonData.getString("オブジェクト名");
```


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