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()を見つけるのに時間がかかったというだけ。