Webアプリケーション
Webアプリ側は、手っ取り早く Ruby On Railsで作成。(Railsのヴァージョンは、2.3.8を入れてあるので、databaseのdefaultは、sqlite3)
Webアプリのイメージは、在庫管理用の商品コードの保管と表示。モデルは、在庫Stock。StockをiPhone側から扱うコントローラは、Apiと言う名前にした。
$ rails testapp $ cd testapp $ script/generate model Stock $ script/generate controller Api index
"Stock" modelのmigrationの中身は、以下の感じ
- create_table :stocks do |t|
- t.string :name # 商品名 今回は、無用。
- t.string :code # 商品コード
- t.timestamps
- end
controllerの中身は、WebAPI的なのりで作成してみた。APIの仕様?は以下の通り。
http://hogehoge/api/ --- 全てをjson形式で提供(表示) http://hogehoge/api/show/code_no --- コード = code_no のstockをjsonで提供 http://hogehoge/api/upload/code_no --- 新しいデータを登録 code = code_no
例外処理とか未だ入れてないので、エラー頻発だ。
- class ApiController < ApplicationController
- # 全て表示のアクション
- def index
- @stocks = Stock.all
- # レスポンスは、jsonにフォーマットして出力
- respond_to do |format|
- format.json { render :json => @stocks, :callback => params[:callback] }
- end
- end
- # 商品コードを指定して出力
- def show
- @stock = Stock.find_by_code(params[:id])
- respond_to do |format|
- format.json { render :json => @stock, :callback => params[:callback] }
- end
- end
- # 今回の主役。商品コードを受け取り、データベースに保管する
- # レスポンスは、textにした
- def upload
- message = 'Upload Error'
- if params[:id] && stock = Stock.new({:code => params[:id]})
- message = 'Save New Code :' + stock.code if stock.save
- end
- render :text => message
- end
- end
これで、script/server でテストサーバを起動。
http://hogehoge:3000/api/ を試してみた。確かにjson形式で出力されている。
Titunium側のプログラム(一部)
さて、Tituniumアプリ側の該当部分。HTTPClientオブジェクトを操作する。- var win = Ti.UI.currentWindow;
- var sendButton = Ti.UI.createButton({
- title:'Send Data',
- top:200,
- left:10,
- width:300,
- height:100
- });
- win.add(sendButton);
- // sendボタンのclickイベントを記述
- sendButton.addEventListener('click', function(){
- // HTTPClientオブジェクトを用意
- var xhr = Ti.Network.createHTTPClient();
- xhr.timeout = 1000000;
- var sample = '12345'; // サンプルデータ
- var url = 'http://hogehoge:3000/api/upload/' + sample;
- xhr.open('GET',url);
- // ロードされた場合の処理を記述。
- // ここではレスポンスを受け取ってダイアログボタンに結果を返すと定義。
- xhr.onload = function(){
- var res = this.responseText;
- Ti.UI.createAlertDialog({
- title: 'Send Data',
- message: res
- }).show();
- };
- // リクエストを送信する。レスポンスが帰ったときに、onloadアクションとなる。
- xhr.send();
- });
iPhoneアプリをエミュレータで起動。[send]ボタンを押すと、サーバアプリにサンプルデータが送信され、その結果がモーダルボタンで表示される。
気になったこと
- ボタンイベントに変数(この場合はデータ)を渡す方法
- HTTPClientの接続失敗の処理方法
- send()のタイミングは、正しいか?