foursquareのスポット検索をサーブレットで実行する

以前、同種の位置情報サービスであるロケタッチのスポット検索を実装した。foursquareもロケタッチもスポット検索についてはほぼ類似の機能・アクセス方法を提供している。(特定のURLを呼び出して検索を実行し、結果はJSON形式で返却される。)

  • ロケタッチ:https://api.loctouch.com/v1/spots/search
  • foursquare:https://api.foursquare.com/v2/venues/search

いずれもパラメータを与えて検索を実行するが、foursquareはユーザに関する情報(*)も付加しないといけないという違いがある。
(*)認証は必要ではないが、アプリケーションの連携を許可した際に得られるアクセストークンが必要。
もちろんブラウザからも実行できるが、今後の自動チェックインのことも考えて、検索機能をサーブレットとして実装し、サーバからfoursquareにリクエストを発行する形態にすることを考える。

  • ロケタッチ:クライアント(ブラウザ)からリクエスト発行

    https://api.loctouch.com/v1/spots/search

    クロスドメイン呼び出しになるので、JSONPを利用して検索結果を受け取る

  • foursquare:サーバからリクエスト実行
    http://triplifeplan.appspot.com/xloc/spotsearch (URLは仮)
    内部的な処理手順は以下のとおりとなる。
    (1)ブラウザからサーブレット呼び出し
    (2)サーバからfoursquareに検索リクエストを発行し、検索結果を受け取る
    (3)JSON形式でブラウザに検索結果を返す
    (4)ブラウザは結果を処理(表示など)する

いずれも「URL呼び出し→JSON形式で結果受取」という流れになるので、ブラウザアプリケーションのコーディング(JavaScript)は同じように行える。

  • サーブレットの作成(サーブレット名:SearchSpotServlet)
    サーブレットクラスを作成し、内部ロジックを完成させる。URLで指定したパラメータは、HttpServletRequest オブジェクトに対する getParameter()メソッドで取得することができる。スポット検索の結果をgoogle-gjonライブラリを使ってJSON形式に変換する。全体のコードは以下のイメージ。

    // Java
    public class SearchSpotServlet extends HttpServlet {
     public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException{
        // foursquare検索用パラメータ
        String ll = "35.710063,139.810697";
        String query = null;
        Integer limit = null;
        String intent = null;
        // URLの入力パラメータの解析 (?key1=value1&key2=value2)
        if (req.getParameter("ll") != null) { ll = req.getParameter("ll"); }
        if (req.getParameter("query") != null) { query = req.getParameter("query"); }
        if (req.getParameter("limit") != null) { 
          limit = Integer.parseInt( req.getParameter("limit") ); 
        }
        if (req.getParameter("intent") != null) { intent = req.getParameter("intent"); }
    
        Result<VenuesSearchResult> result = null; // 検索結果をセットする変数
          try {
            result = searchSpotFoursquare(ll, query, limit, intent); // 検索実行
            // 内部でfoursquare-api-javaライブラリを利用している
            Gson gson = new Gson(); // JSONライブラリの初期化
            String jsonStr = gson.toJson(result); // 検索結果をJSON形式に変換する
            resp.setContentType("application/json; charset=UTF-8");
            resp.getWriter().println(jsonStr); // JSON形式の検索結果をブラウザに返す
          } catch (FoursquareApiException e) {
            // 例外処理 e.printStackTrace();
        }
      }
    }
    
  • サーブレットクラスとURLを関連付ける(/searchspot)
    方法はこちら
  • サーブレットを呼び出す
    作成したサーブレットはJSON形式で結果を返すので、jQueryのgetJSON関数を使う。

    // JavaScript
    url = 'http://localhost:8888/searchspot?ll=35.694201,139.736648&limit=30&query=駅'
    $.getJSON(url, {}, function(data){
      // dataにJSONデータがセットされる 
    }
    

    検索を含めたコードのイメージは以下。

    // JavaScript
    function searchFrsqSpots(){
      var ll; // 検索の中心となる経緯度。必須項目
      var limit; // 検索結果の数。仕様上は省略可だが、今回は必ず指定する。
      var query; // 検索キーワード(例:「駅」)。省略可。
      var url; // サーブレットのパス
    	
      // スポット検索のパラメータを設定
      ll = gMap.getCenter().lat() + ',' + gMap.getCenter().lng(); // 地図は
      limit = ($('#txtFrsqLimit').val() == '')? '30' : $('#txtFrsqLimit').val();
      query = $('#txtFrsqKeyword').val();
      url = gServerPath + 'searchspot?ll=' + ll + '&limit=' + limit;
      if (query != ''){ url += '&query=' + query; }
    
      // スポット検索実行
      var venues; // 検索結果(のうち地点に関するもの)の格納場所
      var spots = []; // 表示用のデータ格納場所
      $.getJSON(url, {}, function(data){ // サーブレット実行
        venues = data['result']['venues']; // 結果から地点情報を取り出す
        for (var i = 0; i < venues.length; i++) {
          var spot = new Object();
          // 中略 - 必要な項目のみ表示用の変数にコピーする
          spots.push(spot);
        }
        showGridLoctSpotList(spots); // 結果を表形式で画面表示
        displayLoctSpots(spots); // 結果をマーカーにして地図に表示
      }
    }
    
  • 実行例
    xlocspot04_a01

    xlocspot04_a02

カテゴリー: Development, Location Service タグ: , , パーマリンク