SQLの窓

2017年05月14日


OkHttp v3.8.0 jar( と okio 1.13.0.jar ) を Eclipse のプロジェクトに追加して一般的な POST 送信を行う

Android Studio では、Gradle に compile 'com.squareup.okhttp3:okhttp:3.8.0' を追加すれば済むと思いますが、Eclipse のプロジェクトでは、普通に lib フォルダを追加して、そこに二つを置いて右クリックから追加しました。



※ 右クリックから参照の追加をしないで、外部 jar の追加で処理すると、jar の場所が相対位置にならないので注意


OkHttp のダウンロード

OkHttp
An HTTP & HTTP/2 client for Android and Java applications


( 大きいのが OkHttp で下の小さいリンクが 依存ライブラリの okio です )

Javadoc

呼び出す WEB アプリ

結果が解りやすいので、メール送信です。

▼ リンク先にサンプルコードがあります
mb_send_mail を使用したメール送信テンプレート

POST メソッドで受け取った時のみ送信するようになっています。

Java のコード
import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class Main {

	public static void main(String[] args) {

		// HTTP 処理用オプジェクト
		OkHttpClient client = new OkHttpClient();		

		// POST 用 FormBody の内容の作成
		FormBody.Builder formbodyBuilder = new FormBody.Builder();
		formbodyBuilder.add("to", "xxxxxx@gmail.com");
		formbodyBuilder.add("body", "日本語\r\n表示");
		formbodyBuilder.add("subject", "OkHttp で送信テスト");

		// 送信用ユニットの作成
		FormBody formbody = formbodyBuilder.build();

		// 送信用のデータを作成
		Request.Builder requestBuilder = new Request.Builder();
		String url = "http://localhost/lightbox/send_post_test.php";
		requestBuilder.url(url);
		requestBuilder.post(formbody);
		Request request = requestBuilder.build();

		// 受信用のオブジェクトの準備
		Call call = client.newCall(request);
		String result = "";

		// 送信と受信
		try {
			
			Response response = call.execute();
			result = response.body().string();
			
		} catch (Exception e) {
			e.printStackTrace();
		}

		// 受信結果の表示
		System.out.println(result);

	}

}

OkHttp では、メソッドの戻り値をオブジェクト自体にする事によって、チェーンするコードが書けるようになっていますが、イマいち直感的では無いので、それぞれのオプジェクト毎の記述で行っています。

▼ 以下は、ローカルに送った内容をトレースで記録したものです
POST /lightbox/send_post_test.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 150
Host: localhost
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.8.0

to=xxxxxx%40gmail.com&body=%E6%97%A5%E6%9C%AC%E8%AA%9E%0D%0A%E8%A1%A8%E7%A4%BA&subject=OkHttp%20%E3%81%A7%E9%80%81%E4%BF%A1%E3%83%86%E3%82%B9%E3%83%88


関連する記事

Android Studio : OkHttp v3.8.0 で WEBアプリに POST 送信を行う


タグ:post OkHttp
posted by lightbox at 2017-05-14 18:44 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2016年04月03日


java をコマンドプロンプトからビルドして実行するサンプル。( メール送信が初心者には楽しいはず )

4月からの java の授業の開発環境は AndroidStudio がメインになりますが、コマンドプロンプトから地味に扱う方法や、Android では無いアプリの Eclipse での扱いも知って欲しいので昔のキットを引っ張り出して整備しています。

まずは、コマンドプロンプトから


※ 当然 JDK は必要です。あるという前提で。

ソース
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class Main {

	// **********************
	// エントリポイント
	// **********************
	public static void main(String[] args) {
		Main thisClass = new Main();
	}

	// **********************
	// コンストラクタ
	// **********************
	public Main() {
		super();
		my_acton();
	}

	// **********************
	// 初期処理
	// **********************
	private void my_acton() {

		MyTool out = new MyTool(">>>");
		out.println("処理開始");

		// **********************
		// プロパティオブジェクトを作成
		// プロパティオブジェクトは、extends Hashtable(連想配列)
		// **********************
		Properties props = new Properties();
	
		// **********************
		// * 連想配列に送信用サーバのアドレスをセット
		// **********************

		// gmail の場合は、以下のリンクより、安全性の低いアプリの許可: 有効 に変更
		// https://myaccount.google.com/security?pli=1#connectedapps
		// props.put("mail.smtp.host","smtp.gmail.com");

		// 以下 Yahoo!
		props.put("mail.smtp.host","smtp.mail.yahoo.co.jp");

//		props.put("mail.smtp.port","587");	// サブミッションポート
		props.put("mail.smtp.auth", "true" );	// SMTP 認証を行う

		props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		props.put("mail.smtp.socketFactory.fallback", "false");
		props.put("mail.smtp.socketFactory.port", "465");

		// **********************
		// メール用のセッションを作成
		// **********************
		SimpleAuthenticator sa =
			new SimpleAuthenticator("ユーザID","パスワード");
		Session MailSession = 
			Session.getInstance( props, sa );
	
		try {
	
			// **********************
			// メール用のメッセージオブジェクトを作成
			// **********************
			MimeMessage msg = new MimeMessage(MailSession);
	
			// **********************
			// 宛先
			// **********************
			msg.setRecipients(
				Message.RecipientType.TO,
				"メールアドレス"
			);
	
			// **********************
			// 送信者
			// **********************
			msg.setFrom(
				new InternetAddress( "ユーザID@yahoo.co.jp", "私です", "ISO-2022-JP")
			);
	
			// **********************
			// 件名
			// **********************
			msg.setSubject(
				MimeUtility.encodeText(
					"日本語件名",
					"iso-2022-jp",
					"B"
				)
			);
	
			// **********************
			// 本文
			// **********************
			msg.setContent(
				"本文\n本文",
				"text/plain; charset=\"iso-2022-jp\""
			);
	
			// **********************
			// 送信
			// **********************
			Transport.send( msg );
	
		}
		catch (Exception e) {
			out.println("送信エラー");
			e.printStackTrace();
		}

		out.println("処理終了");

	}

	// **********************
	// 内部用クラス
	// **********************
	private class MyTool {

		private String mark = null;

		MyTool(String pm) {
			mark = pm;
		}

		public void println(String str) {
			StringBuilder sb = new StringBuilder();
			sb.append(this.mark);
			sb.append(str);
			String s = sb.toString();		
			System.out.println( s );
		}

	}

	// **************************
	// 認証用のプライベートクラス
	// **************************
	private class SimpleAuthenticator extends Authenticator {
	
		private String user_string = null;
		private String pass_string = null;
	
		public SimpleAuthenticator( String user_s, String pass_s ) {
			super();
			user_string = user_s;
			pass_string = pass_s;
		}
	
		protected PasswordAuthentication getPasswordAuthentication(){
			return new PasswordAuthentication( this.user_string, this.pass_string );
		}
	}

}

Yahoo! メールと Gmail でテストしていますが、Gmail は 安全性の低いアプリの許可を『有効』にする必要があります。

mail.jar によるメールを送る為のビルド環境は同梱しています。java_build.wsf を実行していただくと、ビルド用のコマンドプロンプトが開きますが、前提として JDK の場所は指定していただく必要があります。

▼ __buildPath.txt
C:\Program Files\Java\jdk1.8.0_66\bin

; 行先頭にセミコロンはコメントです。
; また、一つでも有効な行を発見したら、それを使用して次の行以降は読み込みません
; なにも無い行は無視します
;
; ※ いろいろなバージョンをこれで切り替えて処理します
バージョンを切り替えたい場合はいくつも書いて、必要の無い行の先頭に ;(セミコロン)を入れます。 CLASSPATH の指定方法として、既に mail.jar の指定がされているので適宜変更します。 ▼ __classPath.txt
.;..\mail.jar

; 行先頭にセミコロンはコメントです。
; また、一つでも有効な行を発見したら、それを使用して次の行以降は読み込みません
; なにも無い行は無視します
;
..mail.jar になっているのは、__targetPath.txt の指定で、カレントが javamail フォルダになっており、そこからの相対位置になる必要があるからです。 実行 java_start.wsf を実行しますが、__java_start.txt の中に書いた内容が1行づつ実行されます
java Main
pause
exit
※ その他は、readme.txt を参照して下さい
タグ:java
posted by lightbox at 2016-04-03 21:01 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2015年05月04日


Eclipse + JFace : HttpURLConnection で GET

やりたい事は簡単でも、環境からの説明を入れると長くなってしまうので、それぞれの要点部分は他から参照するようにしています。

対象とする URL は、PHP で作成した簡易掲示板です。この簡易掲示板は、Google Chrome で開いた時のみ簡易掲示板として働きます。それ以外では 簡易的な JSON の文字列で掲示板用のデータを返します。Google Chrome でも、モバイルモードで、デバイス無しで UA を適当に文字列入れると JSON で表示します。

Java で Window プログラムをテストするのに、Vector で配布されている自己解凍式の Pleiades を使い、Window Builder ですぐボタンとそのイベントコードまでが作成されます。後は、そのイベントからここにあるクラスを作成して呼び出すだけです。

このクラスは、元々は Android 用に作ったもので、リンク先には POST もあります。

ここでは、まだ実装していませんが、この後 Google gson を使って JSON データを利用する事になります。

プロジェクト作成からボタン作成まで

日本語 Eclipse 4.4 Pleiades All in One Java(Vector から) で即 Window Builder


HttpGet クラス

※ セッション対応した、HttpGet と HttpPost はこちらから
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;


public class HttpGet {

	// **********************************************
	// URL と charset の初期値
	// **********************************************
	private String initTargetUrl = "http://toolbox.winofsql.jp/log.php";
	private String initTargetCharset = "utf-8";

	// **********************************************
	// コンストラクタによって初期値が違います
	// **********************************************
	public HttpGet() {
	}
	public HttpGet(String targetUrl) {
		initTargetUrl = targetUrl;
	}
	public HttpGet(String targetUrl,String targetCharset) {
		initTargetUrl = targetUrl;
		initTargetCharset = targetCharset;
	}

	// **********************************************
	// コンストラクタで指定した URL と charset で処理
	// **********************************************
	public String execute() {
		return execute(initTargetUrl,initTargetCharset);
	}

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

		StringBuffer web_data = new StringBuffer();

		try {

			// **********************************************
			// インターネットへの接続
			// **********************************************
			// 読み込む 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();
	}

}

読み出す URL 部分には、以下のページで紹介している内容を使用しています。

PHP による『超簡易掲示板』 / アプリケーションからの POST 検証用


本来は localhost に設置して Google Chrome でデータを登録した結果を JSON で取得するように作成されています

localhost の構築は、以下で説明している 『AN HTTP Server』を使用すると簡単です

実運用では無く、学習用の WWWサーバーとしてはこれ以外に無い『AN HTTP Server』ですが、古いソフトなので使い方にコツがあります


読み出し部分
	/**
	 * Create contents of the application window.
	 * @param parent
	 */
	@Override
	protected Control createContents(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);
		container.setLayout(null);
		{
			Button btnNewButton = new Button(container, SWT.NONE);
			btnNewButton.addSelectionListener(new SelectionAdapter() {
				@Override
				public void widgetSelected(SelectionEvent e) {
					System.out.println("ボタンの処理");
					HttpGet hg = new HttpGet();
//					String result = 
//							hg.execute(
//									"http://localhost/basic/log_01/log.php",
//									"utf-8"
//									);
					String result = hg.execute();
					System.out.println(result);
				}
			});
			btnNewButton.setBounds(10, 10, 81, 28);
			btnNewButton.setText("New Button");
		}

		return container;
	}
localhost で行った実行結果は以下のようになっています。


 

Eclipse で、コメントのオン・オフは、行を選択して CTRL + / です。

▼ localhost を Google Chrome で開いたものです。



posted by lightbox at 2015-05-04 16:35 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

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

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