[Android] HttpURLConnection:POSTリクエストでバイトデータを送信する

HttpURLConnectionを利用するとHTTP通信処理を実装することができます。ここでは、HttpURLConnectionを使ってPOSTリクエストを実行し、バイトデータを送信する方法について説明します。
広 告
目次
前提条件
- 「AyncTask:非同期処理を実装する」を理解していること
動作確認端末
- Google Nexus 7 – 5.1.1 – API22(実機)
1. インターネット接続の許可を与える
アプリがインターネット接続するためには、アプリに対して「ネットワークへのフルアクセス」の許可を与える必要があります。
「ネットワークへのフルアクセス」の許可を与えるためには、マニフェストファイルの
<manifest>
タグ配下に以下のパーミッションを1行を追加します。
src/main/AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
java.net.SocketException: socket failed: EACCES (Permission denied)
の例外が発生します。
2. HttpURLConnectionを使ったPOSTリクエストの実装例
まずはHttpURLConnectionを使ってPOSTリクエストを実行し、テキストを取得する処理の実装例を示します。
HTTP通信のようなインターネット通信処理は、ThreadやAsyncTaskなどを使用して別スレッド(ワーカースレッド)で実装する必要があります。今回の例では、AsyncTaskを使います。
HttpURLConnectionを使ったPOSTリクエストの実装例
import android.content.Context; import android.os.AsyncTask; import java.io.IOException; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public final class HttpPostTask extends AsyncTask<URL, Void, Void> { @Override protected Void doInBackground(URL... urls) { final URL url = urls[0]; HttpURLConnection con = null; try { con = (HttpURLConnection) url.openConnection(); con.setDoOutput(true); con.setChunkedStreamingMode(0); con.connect(); // POSTデータ送信処理 OutputStream out = null; try { out = con.getOutputStream(); out.write("POST DATA".getBytes("UTF-8")); out.flush(); } catch (IOException e) { // POST送信エラー e.printStackTrace(); } finally { if (out != null) { out.close(); } } final int status = con.getResponseCode(); if (status == HttpURLConnection.HTTP_OK) { // 正常 // レスポンス取得処理を実行 } } catch (IOException e) { e.printStackTrace(); } finally { if (con != null) { con.disconnect(); } } return null; } }
上記のHttpPostTask
を呼び出し例は以下のとおりです。Activity
やFragment
のライフサイクルメソッドなどメインスレッドにて実装します。
HttpPostTaskの呼び出し例
try { new HttpPostTask().execute(new URL("http://xxxxxxxxxx/xxxxxx/")); } catch (MalformedURLException e) { e.printStackTrace(); }
AsyncTask#execute()メソッドの引数には、リクエス先のURLオブジェクトを渡します。
3. POSTリクエストする
アクセス先URL情報を持ったURLオブジェクトに対してURL#openConnection()メソッドを実行すると、HttpURLConnectionオブジェクト(コネクション)を取得することができます。
POSTリクエストするためには、まず以下のようにHttpURLConnection#setDoOutput()でHttpURLConnectionオブジェクトにtrue
を設定する必要があります。
POSTリクエストのするための設定
con.setDoOutput(true);
POSTデータ送信処理時に無駄なメモリ使用・処理時間をかけないために、あらかじめPOSTデータサイズがわかっている場合はHttpURLConnection#setFixedLengthStreamingMode()を使ってデータサイズを設定するか、不明の場合はHttpURLConnection#setChunkedStreamingMode()を使って0
を設定するかします。
POSTリクエストのパフォーマンスを向上させるための設定
con.setChunkedStreamingMode(0);
URLConnection#connect()メソッドで実際にインターネット接続をします。
POSTデータを送信するコードは以下のとおりです。
POSTデータ送信
// POSTデータ送信処理 OutputStream out = null; try { out = con.getOutputStream(); out.write("POST DATA".getBytes("UTF-8")); out.flush(); } catch (IOException e) { // POST送信エラー e.printStackTrace(); } finally { if (out != null) { out.close(); } }
Nexus7 端末で上記コードを実行した場合、以下のようなPOSTリクエストが送信されます。
Nexus7で実行した場合のTCPダンプ
POST /xxxx HTTP/1.1 Transfer-Encoding: chunked User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.1.1; Nexus 7 Build/LMY47V) Host: xxxx.xxxx.xxxx.xxxx Connection: Keep-Alive Accept-Encoding: gzip Content-Type: application/x-www-form-urlencoded 9 POST DATA 0
POSTデータ送信するためには処理には、出力用ストリームを使います。ストリームのクラスとしてはOutputStreamを用います。ストリームは以下の手順で実行されます。
- 1. ストリームを開く
- 2. データが存在する限り、書き込みを継続する
- 3. ストリームを閉じる
OutputStreamオブジェクトをURLConnection#getOutputStream()を使って取得することでストリームを開くことができます。ストリームを開いた後は、OutputStream#write()を使ってバイトデータを書き出します。
最後にストリームは閉じるようにします。
処理終了後は、不要なコネクションを残さないために、明示的にコネクションを切断してあげる必要があります。
コネクションを切断
con.disconnect();
4. 参考URL
HttpURLConnection | Android Developers
http://developer.android.com/intl/ja/reference/java/net/HttpURLConnection.html