Programming Style

メニュー

初心者がアプリ開発者になるためのプログラミング学習サイト

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

android-common-top

HttpURLConnectionを利用するとHTTP通信処理を実装することができます。ここでは、HttpURLConnectionを使ってPOSTリクエストを実行し、バイトデータを送信する方法について説明します。

 

広 告

 

目次

前提条件

動作確認端末

  • Google Nexus 7 – 5.1.1 – API22(実機)

1. インターネット接続の許可を与える

 

アプリがインターネット接続するためには、アプリに対して「ネットワークへのフルアクセス」の許可を与える必要があります。

  android-httpurlconnection-get-text-01   「ネットワークへのフルアクセス」の許可を与えるためには、マニフェストファイルの<manifest>タグ配下に以下のパーミッションを1行を追加します。  

 

src/main/AndroidManifest.xml

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

 

Note : もし許可を与えずにインターネット通信を行うとjava.net.SocketException: socket failed: EACCES (Permission denied)の例外が発生します。

 

 

 

 

2. HttpURLConnectionを使ったPOSTリクエストの実装例

 

まずはHttpURLConnectionを使ってPOSTリクエストを実行し、テキストを取得する処理の実装例を示します。

 

HTTP通信のようなインターネット通信処理は、ThreadAsyncTaskなどを使用して別スレッド(ワーカースレッド)で実装する必要があります。今回の例では、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を呼び出し例は以下のとおりです。ActivityFragmentのライフサイクルメソッドなどメインスレッドにて実装します。

 

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

 

 

 

 

 

広 告

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です