SQLの窓

2015年06月01日


Android Studio : GET(POST)メソッドで呼び出す際に、PHP 側のセッションを有効にする為に CookieManager を static で使用する



GET メソッドで URL を呼び出して、呼び出し先のセッションが有効である事を確認します

HttpGet.java

1) CookieManager を static で作成して呼び出し先のセッションを有効にします。
2) 実行時の引数に QueryString 用の Map を使用可能にして、必要なければ null を指定します
package app.lightbox.winofsql.jp.sessionid;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;

/**
 * Created by lightbox on 2015/06/01.
 */
public class HttpGet {

	// セッションを有効にする為、常に存在させるよう static で定義
	private static CookieManager manager = null;

	// **********************************************
	// コンストラクタ
	// **********************************************
	public HttpGet() {
		if ( manager == null ) {
			manager = new CookieManager();
			// 以下をコメントにするとセッションは働きません
			CookieHandler.setDefault(manager);
		}
	}

	// **********************************************
	// 指定した URL へ 任意の charset で処理
	// **********************************************
	public String execute(String targetUrl,String targetCharset,Map<String,String> params) {

		StringBuffer web_data = new StringBuffer();

		try {
			// **********************************************
			// Query String の作成( 必要無ければ引数を null とする )
			// **********************************************
			String data = "";
			if ( params != null ) {
				Iterator<String> it =  params.keySet().iterator();
				String key = null;
				String value = null;
				while(it.hasNext()) {
					key = it.next().toString();
					value = params.get(key);
					if ( !data.equals("") ) {
						data += "&";
					}
					data += key + "=" + URLEncoder.encode(value, targetCharset) ;
				}
				if ( !data.equals("") ) {
					targetUrl = targetUrl + "?" + data;
				}
			}

			// **********************************************
			// インターネットへの接続
			// **********************************************
			// 読み込む WEB上のターゲット
			URL url = new URL(targetUrl);
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			// GET メソッド
			http.setRequestMethod("GET");
			// 接続
			http.connect();

			// **********************************************
			// ストリームとして読み込む準備
			// **********************************************
			// 以下読み込み3点セット InputStream / InputStreamReader / BufferedReader
			InputStream input_stream = http.getInputStream();
			// UTF-8 でリーダーを作成
			InputStreamReader input_stream_reader = new InputStreamReader(input_stream, targetCharset);
			// 行単位で読み込む為の準備
			BufferedReader buffered_reader = new BufferedReader(input_stream_reader);

			// **********************************************
			// 行の一括読み込み
			// **********************************************
			String line_buffer = null;
			// BufferedReader は、readLine が null を返すと読み込み終了
			while ( null != (line_buffer = buffered_reader.readLine() ) ) {
				web_data.append( line_buffer );
				web_data.append( "\n" );
			}

			// **********************************************
			// 接続解除
			// **********************************************
			http.disconnect();
		}
		catch(Exception e) {
			// 失敗
			System.out.println( e.getMessage());
		}
		return web_data.toString();
	}
}

関連する記事

Eclipse + JFace : HttpURLConnection で GET

session_id.php : セッション確認用の PHPコード

QueryString のテスト用に、$_GET['display'] をセットした場合、$_SERVER の内容を返すようにしています。

Android 側で複数回呼び出して、session_id の表示が毎回同じであればセッションが有効です
<?php
session_start();
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

print session_id();

if ( $_GET['display'] == '環境' ) {
	print "\n";
	print_r( $_SERVER );
}

?>


HttpGet を呼び出して画面へ結果をセット

ボタンを配置し、その下に ScrollView を置いて、その中の TextView に表示します。( Android のインターネットアクセスなので、AsyncTask を使用しています )

呼び出し先は、localhost に用意しているので、Android の中からは 10.0.2.2 で呼び出します
( Special alias to your host loopback interface / i.e., 127.0.0.1 on your development machine )
		Button button = (Button) this.findViewById(R.id.button);
		button.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				new AsyncTask<String, Void, String>() {

					// 非同期処理
					@Override
					protected String doInBackground(String... params) {
						// インターネットアクセス
						HttpGet hg = new HttpGet();
						Map map = new HashMap();
						map.put("display", "環境");
						String result = hg.execute(params[0], params[1],map);
						return result;
					}

					// UI スレッド処理
					@Override
					protected void onPostExecute(String s) {
						super.onPostExecute(s);

						TextView tv = (TextView) MainActivity.this.findViewById(R.id.textView);
						tv.setText(s);

					}
				}.execute("http://10.0.2.2/basic/session_id.php", "utf-8");

			}
		});

※ インターネットアクセスには、AndroidManifest に android.permission.INTERNET が必要です

関連する記事

Android Studio で AsyncTask / Android Studio ならではの操作でコードを楽々作成

画面定義
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:paddingBottom="@dimen/activity_vertical_margin"
                tools:context=".MainActivity">

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="表示"
        android:id="@+id/button"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"/>

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/scrollView"
        android:layout_below="@+id/button"
        android:layout_marginTop="16dp"
        android:layout_alignParentStart="true"
        android:background="@android:color/white">

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:id="@+id/textView"
            android:layout_below="@+id/button"
            android:layout_alignParentStart="true"
            android:background="#ffffffff"/>

    </ScrollView>>

</RelativeLayout>


CookieManager を使用した HttpPost クラス


package app.lightbox.winofsql.jp.sessionid;

import android.util.Log;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookieStore;
import java.net.HttpCookie;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * Created by lightbox on 2015/06/01.
 */
public class HttpPost {

	// セッションを有効にする為、常に存在させるよう static で定義
	private static CookieManager manager = null;

	// **********************************************
	// コンストラクタ
	// **********************************************
	public HttpPost() {
		if ( manager == null ) {
			manager = new CookieManager();
			// 以下をコメントにするとセッションは働きません
			buildCookieManager();
		}
	}

	// **********************************************
	// CookieManager 作成
	// **********************************************
	private void buildCookieManager() {
		manager = new CookieManager();
		CookieHandler.setDefault(manager);
	}

	// **********************************************
	// Cookie の表示テスト
	// **********************************************
	public void showCookie() {
		CookieStore store = manager.getCookieStore();
		List<HttpCookie> cookies = store.getCookies();
		for (int i = 0; i < cookies.size(); i++) {
			HttpCookie cookie = cookies.get(i);
			Log.i("lightbox", "Cookie[" + i + "]: " + cookie);
		}
	}

	// **********************************************
	// 指定した内容で処理
	// **********************************************
	public String execute(String targetUrl,String targetCharset,Map<String,String> params) {

		StringBuffer get_data = null;

		try {

			// ターゲット
			URL url = new URL(targetUrl);
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			http.setConnectTimeout(30000);
			http.setReadTimeout(30000);
			http.setDoInput(true);    // application/x-www-form-urlencoded がセットされる
			http.setRequestMethod("POST");

			OutputStreamWriter osw = new OutputStreamWriter(http.getOutputStream());
			BufferedWriter bw = new BufferedWriter(osw);

			Iterator<String> it =  params.keySet().iterator();
			String key = null;
			String value = null;
			String data = "";
			while(it.hasNext()) {
				key = it.next().toString();
				value = params.get(key);
				if ( !data.equals("") ) {
					data += "&";
				}
				data += key + "=" + URLEncoder.encode(value, targetCharset) ;
			}

			Log.i("lightbox", "送信内容 : " + data);

			bw.write(data);

			bw.close();
			osw.close();

			// 以下読み込み3セット
			InputStream i_stream = http.getInputStream();
			// UTF-8 でリーダーを作成
			InputStreamReader i_stream_reader = new InputStreamReader(i_stream, targetCharset);
			// 行単位で読み込む為の準備
			BufferedReader b_reader = new BufferedReader(i_stream_reader);

			// 行の一括読みこみ
			String line_buffer;
			get_data = new StringBuffer();
			// BufferedReader は、readLine が null を返すと読み込み終了
			while ( null != (line_buffer = b_reader.readLine() ) ) {
				get_data.append( line_buffer );
				get_data.append( "\n" );
			}

			// 接続解除
			http.disconnect();
		}
		catch(Exception e) {
			// 失敗
			System.out.println( e.getMessage());
		}
		return get_data.toString();
	}

}

http://toolbox.winofsql.jp/log.php は、セッションを使用した簡易掲示板のデモページです。

デモページ


タグ:Android Studio
【1 Android Studioの最新記事】
posted by lightbox at 2015-06-01 16:27 | 1 Android Studio | このブログの読者になる | 更新情報をチェックする
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり