2014年2月8日土曜日

androidからHttpClientでHTTP-Post通信をする

androidでは、HTTP通信をするための方法として、下記のふたつがある。

  • HttpURLConnection (java.net)
  • HttpClient (org.apache.http)

ここでは、HttpClientを使用する方法を紹介する。

HttpURLConnectionとHttpClientの違いについては、下記のサイトが参考になった。
Y.A.M の 雑記帳: Android Apache HTTP Client と HttpURLConnection どっちを使うべき?

HttpURLConnectionを使用する方法は下記を参照。
androidからAsyncTaskLoaderでHTTP-Post通信をする

 

Http通信処理を実現するためには、Androidアプリで下記の3つの部品を実装する。

  • UI処理
  • 通信データ
  • バックグラウンド処理

Androidアプリのマニフェストファイルにインターネット接続のパーミッションを追加すること。

また、サーバ側でも何らかの応答を返す処理を実装する必要がある。

UI処理

アプリケーション実行時に呼び出されるアクティビティ。
ここで通信データを生成し、バックグラウンド処理に渡す。

package net.kuttya.httppostsample2;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;

public class MainActivity extends FragmentActivity implements LoaderCallbacks {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// サーバにデータ送信(初期化)
TransData sendData = new TransData();
Bundle args = new Bundle();
sendData.data = "test";
args.putSerializable("data", sendData);
getSupportLoaderManager().initLoader(0, args, this);
}

public Loader onCreateLoader(int id, Bundle args) {
if( null != args ) {
TransData sendData = (TransData) args.getSerializable("data");

return new HttpAccesser(this, sendData);
}
return null;
}

public void onLoadFinished(Loader loader, TransData recvData) {
// AsyncTaskLoaderの処理が終了したら呼び出される
if(null == recvData) {
return;
}
else {

}
}

public void onLoaderReset(Loader arg0) {
// AsyncTaskLoaderが破棄されるときに呼び出される
}
}

通信データ


実際に使用する通信データはメッセージ種別など様々な情報が含まれていると思うが、ここでは簡略化して文字列のみを送受信することにする。

package net.kuttya.httppostsample2;

import java.io.Serializable;

public class TransData implements Serializable {
private static final long serialVersionUID = 1L;

public String data;
}

バックグラウンド処理


ここでHTTP-Post通信を実行する。

package net.kuttya.httppostsample2;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;

public class HttpAccesser extends AsyncTaskLoader {
private final static String SERVER_URL = "http://www.sample.com/index.php";
private final static String ENCODE = "UTF-8";

private TransData mSendData = null; // 送信データ
private DefaultHttpClient mHttpClient = null; // HTTPクライアント
private HttpPost mPost = null; // POST通信

public HttpAccesser(Context context, TransData sendData) {
super(context);

this.mSendData = sendData;
}

public TransData loadInBackground() {
// ここに非同期処理で実施したい処理を記載する
TransData recvData = null;

recvData = send(mSendData);

return recvData;
}

public void onCanceled(Boolean data) {
// キャンセル処理
}

protected void onStartLoading() {
// 開始処理
forceLoad();
}

public TransData send(TransData sendData) {
boolean ret = false;
TransData recvData = null;
List params = new ArrayList();
HttpResponse response = null;
HttpEntity resEntity = null;
int resStatus = 0;

// 接続初期化
ret = initConnection();
if(false == ret) {
return null;
}

try {
// 送信データ生成
params.add(new BasicNameValuePair("data", sendData.data));
// UTF-8にエンコードする
mPost.setEntity(new UrlEncodedFormEntity(params, ENCODE));

// 送信
response = mHttpClient.execute(mPost);

// リクエスト結果を取得
resStatus = response.getStatusLine().getStatusCode();

if(200 == resStatus) {
// リクエスト成功
resEntity = response.getEntity();
recvData = new TransData();
recvData.data = EntityUtils.toString(resEntity, ENCODE);
}
} catch(Exception e) {
e.printStackTrace();
recvData = null;
} finally {
try {
if(mHttpClient != null) {
mHttpClient.getConnectionManager().shutdown();
}
} catch(Exception e) {
recvData = null;
}
}

return recvData;
}

private boolean initConnection() {
mHttpClient = new DefaultHttpClient();
mPost = new HttpPost(SERVER_URL);

return true;
}
}

マニフェストファイルにパーミッション追加


下記のパーミッションを追加する。


0 件のコメント:

コメントを投稿