0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-07-04

前回の記事「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」を作ります。

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、本日の日付の3つです。
コードの解説はコメントにて行います。

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) {
            // エラー時に実行される
        }
    });
}

という感じで行えます。

まとめ

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

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です。

追記

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

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?