今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

Slim3でGAEのDatastoreからKeyを使って検索する

GAEでDatastoreに格納した特定のオブジェクトを取り出すのに、Keyを指定すれば確実と思ってコードを書いてたけど、解決までしばらく詰まってたのでメモ。

クライアント側ではKeyは30文字くらいの文字列として渡される。文字列のKeyをパラメータに設定してリクエストを送信。

    var key = hoge.key;
    var url = '/json/hoge.json?key=' + key;
    var request = new XMLHttpRequest();
    request.open('GET', url, true);
    request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
    request.onreadystatechange = function (event) {
        if (request.readState != 4) return;
        if (request.status != 200) return;
        var data = JSON.parse(request.responseText);
       // 
    };


サーバー側では、文字列で受け取ったKeyを KeyFactory.stringToKey()でKey型に変換すればいいだけだった。

    public Hoge find(Map<String, Object> params) {
        String k = (String)params.get("key");
        ModelQuery<Hoge> query = Datastore.query(Hoge.class);
        Key key = KeyFactory.stringToKey(k);
        Hoge hoge = query.filter(meta.key.equal(key)).asSingle();
        return hoge;
    }

要するに、KeyFactory#stringToKey()を見つけるのに時間がかかったというだけ。

(´・ω・`)