楽天トラベル空室検索APIで宿泊履歴を作る

前回の記事「MAに向けてTwilioと楽天トラベル空室検索APIを使ってアプリを作りたい」の3回目(http://qiita.com/fumishitan/items/6b9944ed9d4daec6a3a8)

今回は「reserve」ボタンをタップしたらデータベースに宿泊履歴を更新するようにします。データベースはニフティクラウドmobile backend(mBaaS)というSDKまで提供されているものを使います。

ニフティクラウド　mobile backend
http://mb.cloud.nifty.com/about.htm

## reserveメソッドを動かせるようにする

まず、ボタンをタップしたら動くメソッド「reserve」を作ります。

```js:
function reserve(event){}
```

一覧で表示されたホテルの名前とURLの中からタップが押されたもの取得するためeventを利用しています。
実際にreserveメソッドを動かせるように
これをprocessResponseメソッドのHTML要素追加部分で下記のようなコードを加えます。


```
$(clickInput).click({name : hotelName,url : hotelInfoUrl},reserve);
```

これでreserveメソッドを動かす準備はできました。

## mBaaSへデータを更新できるようにする

mBaaSにデータを上げるにはまずサーバーへの認証を通す準備のためAPIキーをつかったSDKの初期化が必要です。それを行うのが以下になります。

```
var YOUR_APP_KEY = "YOUR_APP_KEY";
var YOUR_CLIENT_KEY = "YOUR_CLIENT_KEY";

$(function(){
    //起動時にmobile backend APIキーを設定
    NCMB.initialize(YOUR_APP_KEY,YOUR_CLIENT_KEY);
});

```

mBaaSのAPIキー（APP_KEYとCLIENT_KEYからなるキー）については下記ドキュメントにも書いてありますので詳しくはそちらを参照ください。


次はreserveメソッドの中身を作っていきます。
今回データベースに入れるデータはホテルの名前、ホテルのURL、本日の日付の３つです。
コードの解説はコメントにて行います。

```
function reserve(event){
    var today = new Date();
　//どのクラス (テーブルのようなイメージと思ってください)にデータを入れるか指定する
    var ReserveHotelClass = NCMB.Object.extend("ReserveHotel”);
    var reserveHotelClass = new ReserveHotelClass();
　//HotelNameカラムを指定しホテルの名前を指定する
    reserveHotelClass.set("HotelName", event.data.name);
　//HotelUrlカラムを指定しホテルのURLを指定する
    reserveHotelClass.set("HotelUrl", event.data.url);
  //Dateカラムを指定しホテルの日付を指定する
    reserveHotelClass.set("Date", today.toISOString());
   //非同期でデータを更新する
　 reserveHotelClass.save(null, {
        success: function(object) {
            // 保存完了後に実行される
    
        },
        error: function(object, error) {
            // エラー時に実行される
        }
    });
}
```

という感じで行えます。

## まとめ

上記までのコードを前回の記事のコードにマージさせると以下のようになります。

```js:app.js
var YOUR_APP_KEY = "YOUR_APP_KEY";
var YOUR_CLIENT_KEY = "YOUR_CLIENT_KEY";

$(function(){
    //起動時にmobile backend APIキーを設定
    NCMB.initialize(YOUR_APP_KEY,YOUR_CLIENT_KEY);
});

var xhr = new XMLHttpRequest();
var current;
function rakutenTravelApi(){
    
    navigator.geolocation.getCurrentPosition(onSuccess, onError, option);
    var lat = current.geopoint.latitude;
    var lng = current.geopoint.longitude;
    
    var rakutentravelApi = "https://app.rakuten.co.jp/services/api/Travel/VacantHotelSearch/20131024";
    var rakutentravelKey ="***************";
    var RANGE = 3;
    var datumType = 1;
    var checkInDate = new Date();
    var checkOutDate = checkInDate;
    
    checkOutDate.setDate(checkOutDate.getDate() + 1);
    var queri = rakutentravelApi + "?applicationId=" + rakutentravelKey + "&checkinDate=" + checkInDate.toISOString().substring(0,10) + "&checkoutDate=" + checkOutDate.toISOString().substring(0,10) + "&latitude=" + lat + "&longitude=" + lng + "&searchRadius=" + RANGE + "&datumType=" + datumType;
    console.log(queri);
    // XMLHttpRequest オブジェクトを作成
   xhr.open("GET",queri,true);
   xhr.onreadystatechange = processResponse;
   xhr.send();
}

//位置情報取得に成功した場合のコールバック
var onSuccess = function(position){
    current = new CurrentPoint();
    current.distance = CurrentPoint.distance;   //検索範囲の半径を保持する    
    current.geopoint = position.coords;         //位置情報を保存する
    //search(current);
};

//位置情報取得に失敗した場合のコールバック
var onError = function(error){
    console.log("現在位置を取得できませんでした");
};

//位置情報取得時に設定するオプション
var option = {
    timeout: 6000   //タイムアウト値(ミリ秒)
};

//現在地を保持するクラスを作成
function CurrentPoint(){
    geopoint=null;  //端末の位置情報を保持する
    distance=0;     //位置情報検索に利用するための検索距離を指定する
}

function processResponse() {
    if(xhr.readyState == 4) {
        if(xhr.status == 200 || xhr.status == 201) {
            // リクエストの処理
            var rakutentravel = JSON.parse(xhr.responseText);
             for(var i in rakutentravel.hotels){
                var hotelName = JSON.stringify(rakutentravel.hotels[i].hotel[0].hotelBasicInfo["hotelName"]);
                var hotelInfoUrl = JSON.stringify(rakutentravel.hotels[i].hotel[0].hotelBasicInfo["hotelInformationUrl"]);
                var clickInput = "search-button" + i;
                $("#hotel-list").append("<li>" + "<p><h3>" + hotelName + "</h3><h4>" + hotelInfoUrl + "</h4>"); 
                
                //$("#hotel-list").append("<p>" );
                $("#hotel-list").append("<h4>"+ "<input id=" + clickInput + " " + "type=" + "'button'" + "value=" + "'reserve'" +"></h4>");
                
                clickInput = "#" + clickInput ;
                $(clickInput).click({name : hotelName,url : hotelInfoUrl},reserve);
             
                $("#hotel-list").append("</p>" );
                $("#hotel-list").append("</li>" );
                $("#hotel-list").listview('refresh');
           
        } else {
            // エラー処理
           
        }
    }
}

function reserve(){
    var today = new Date();
　//どのクラス (テーブルのようなイメージと思ってください)にデータを入れるか指定する
    var ReserveHotelClass = NCMB.Object.extend("ReserveHotel”);
    var reserveHotelClass = new ReserveHotelClass();
　//HotelNameカラムを指定しホテルの名前を指定する
    reserveHotelClass.set("HotelName", event.data.name);
　//HotelUrlカラムを指定しホテルのURLを指定する
    reserveHotelClass.set("HotelUrl", event.data.url);
  //Dateカラムを指定しホテルの日付を指定する
    reserveHotelClass.set("Date", today.toISOString());
   //非同期でデータを更新する
　 reserveHotelClass.save(null, {
        success: function(object) {
            // 保存完了後に実行される
    
        },
        error: function(object, error) {
            // エラー時に実行される
        }
    });
}
```

これでmBaaSのコンパネでデータを上がっていることが確認できたらOKです。

## 追記
重要なことを２点忘れていたので追記

* 1点目　SDKのDL
　これは下記のページよりDLしてください
http://mb.cloud.nifty.com/doc/current/introduction/quickstart_javascript.html#/JavaScript/
スクロールしたところにSDKを閲覧するボタンがあります。
DL後はファイル名を
ncmb-latest.min.js
として
monacaの
www > js に格納してください

* 2点目　htmlでのSDKの読み込み
 こちらはindex.htmlのヘッダーの中に

```html:
<script src="js/ncmb-latest.min.js"></script>
```

と記入していただけたら。大丈夫です。
以上の２点をしていただけたらmBaaSが利用できます。