1
4

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を使ってホテルの予約、宿泊履歴の管理アプリを作る

Posted at

MAに向けてTwilioと楽天トラベル空室検索APIを使ってアプリを作りたい(http://qiita.com/fumishitan/items/6b9944ed9d4daec6a3a8)
の5回目
ここまでで、下記のことができた。

・ホテルの空室を検索し一覧で取得・表示する。
・monacaで現在地の一情報を取得する
・データベースに宿泊履歴を更新する・宿泊が数多すぎたらアラートを上げる

上記の各項目のまとめとして何をやったかを書いていく

ホテルの空室を検索し一覧で取得・表示する

ホテル空室情報取得・表示のため以下のことを行った

・楽天WebServiceでのアプリIDの発行
・楽天トラベル空室検索APIを叩いて・レスポンスを処理する(詳細は下記)
 ・http://qiita.com/fumishitan/items/8e576184315d275a2d52
※monacaを使っていますが、少し変更すればWebでも使えます

monacaで現在地の一情報を取得する

monacaで現在地を取得するには以下のことを行った。
・monacaの新規登録
 ・https://ja.monaca.io/
・プロジェクトの作成(テンプレート:ToDo App)
・位置情報取得ロジックをコーディング(詳細は下記)
 ・http://qiita.com/fumishitan/items/6bee754bf31cf77e0afe

データベースに宿泊履歴を更新する・宿泊が数多すぎたらアラートを上げる

今回はニフティクラウドmobile backend(mBaaS)のデータストアをデータベースとして利用した
ニフティクラウド mobile backend
http://mb.cloud.nifty.com/about.htm

行ったことは以下
・アカウントの作成
・SDKのDL・monaca www>jsフォルダへの配置
  ・http://mb.cloud.nifty.com/doc/current/introduction/quickstart_javascript.html#/JavaScript/
・アプリの作成・キーの取得
・SDKの初期化
・更新ロジックのコーディング(詳細は下記)
 ・http://qiita.com/fumishitan/items/747582a3120a0be2da39
・データベースを検索し、宿泊数を数えるコーディング(詳細は下記)
 ・http://qiita.com/fumishitan/items/1975fd9f0ef99fc590d8

上記の一連の作業をまとめた結果

monacaでTODO Appのテンプレートでプロジェクトを作成し
下記のコードをindex.htmlに貼り付けてください

index.html
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no">
    <script src="components/loader.js"></script>
    <link rel="stylesheet" href="components/loader.css">
    <link rel="stylesheet" href="css/styles.css">
    <script src="js/ncmb-latest.min.js"></script>
    <script src="js/cssua.min.js"></script>
    <script src="js/app.js"></script>
    
</head>
<body>
    <div data-role="page" id="list-page">
        <div data-role="header" data-position="fixed" data-theme="c">
            <h1>Hotelを探そう!</h1>
            <input id="search-button" type="button" value="Search" onclick="rakutenTravelApi()">
        </div>
        <div data-role="content">
            <ul data-role="listview" data-inset="true" id="hotel-list"></ul>
        </div>
    </div>
</body>
</html>

下記のコードをapp.jsに貼り付けてください。

app.js

var xhr = new XMLHttpRequest();
var current;
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);
});

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(event){
    var today = new Date();
    var beforeOneWeek = new Date();
    var HotelClass = NCMB.Object.extend("ReserveHotel");
    var query = new NCMB.Query(HotelClass);
    beforeOneWeek.setDate(beforeOneWeek.getDate() - 7);
    query.greaterThan("Date", beforeOneWeek.toISOString());
    query.count({
        success: function(number) {
            if(number > 1){
                navigator.notification.alert("しっかり休み",alertDismissed , "今週もう3日目やで" , "気をつけます");
            }
        },

        error: function(error) {
            navigator.notification.alert("失敗",alertDismissed , "失敗" , "了解");
        }
    });
 
  //どのクラス (テーブルのようなイメージと思ってください)にデータを入れるか指定する
    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) {
            // エラー時に実行される
        }
    });
}

function alertDismissed() {
        // 任意のコード
}

1
4
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
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?