無料JSONストレージjsonboxを試してみた!
昨夜Github Trendsを眺めていたら、jsonboxというリポジトリを見つけ、面白そうだったので試してみました。
そもそもjsonbox
jsonboxは公開された無料のJSONストレージです。制限事項の範囲で自由に使っていいよ!というサービスです。制限事項に関しては後述しています。
README.mdのサービス説明を引用、翻訳します。
HTTP APIを介してJSONデータを無料で保存、読み取り、変更できます。小規模なプロジェクト、プロトタイプ、またはハッカソンに理想的で、独自のデータストアを作成する必要はありません。
基本機能を試してみる
Create
https://jsonbox.io/${BOX_ID}
へのPOSTリクエストをすることで、レコード作成できます。同じメッセージでも一意な_id
がjsonbox側で振られるので、同じJSONメッセージでも新規レコードとして作成されます。
$ curl -X POST 'https://jsonbox.io/box_shuntaka_1234567' \ -H 'content-type: application/json' \ -d '{"name": "Jon Snow", "age": 18}' {"_id":"5d841d009d1f330017f8f1db","name":"Jon Snow","age":18,"_createdOn":"2019-09-20T00:27:44.105Z"}
BOX_ID
は、20文字以上64文字以下の文字列という制限があります。自分で決めるか、jsonbox.ioで生成される文字列を使う方法があります。誰にも使われていない且つ、予測困難な文字列が良いと思います。
JSONを配列にすれば、複数レコード一括作成できます
$ curl -X POST 'https://jsonbox.io/box_shuntaka_1234567' \ -H 'content-type: application/json' \ -d '[{"name": "Jon Snow", "age": 18}, {"name": "Jon Snow", "age": 18}]' {"_id":"5d841d009d1f330017f8f1db","name":"Jon Snow","age":18,"_createdOn":"2019-09-20T00:27:44.105Z"}
Read
レコード全取得
以下のコマンドで、一覧取得できます。
$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567' [{"_id":"5d84220d9d1f330017f8f1e4","name":"Jon Snow","age":18,"_createdOn":"2019-09-20T00:49:17.990Z"},{"_id":"5d84220b9d1f330017f8f1e3","name":"Jon Snow","age":18,"_createdOn":"2019-09-20T00:49:15.712Z"}]
フィルタリング機能
保存したデータに対して様々なフィルタリングを行うことができます。以下見やすさを考慮するため、適宜jqを使っています。
機能を紹介するためにサンプルデータを投下
# 3レコード作成 $ curl -X POST 'https://jsonbox.io/box_shuntaka_1234567' \ -H 'content-type: application/json' \ -d '[{"name":"Daenerys Targaryen","age":25}, {"name":"Arya Stark","age":16}, {"name":"Jon Snow","age":18}]'
# 内容を確認 $ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567' |jq [ { "_id": "5d8425f59d1f330017f8f1e9", "name": "Arya Stark", "age": 16, "_createdOn": "2019-09-20T01:05:57.967Z" }, { "_id": "5d8425f59d1f330017f8f1ea", "name": "Jon Snow", "age": 18, "_createdOn": "2019-09-20T01:05:57.967Z" }, { "_id": "5d8425f59d1f330017f8f1e8", "name": "Daenerys Targaryen", "age": 25, "_createdOn": "2019-09-20T01:05:57.966Z" } ]
レコードを指定取得
$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567/5d8425f59d1f330017f8f1e8' {"_id":"5d8425f59d1f330017f8f1e8","name":"Daenerys Targaryen","age":25,"_createdOn":"2019-09-20T01:05:57.966Z"}
ageを降順でデータ取得
$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567?sort=-age'| jq # -ageをageにすれば昇順 [ { "_id": "5d8425f59d1f330017f8f1e8", "name": "Daenerys Targaryen", "age": 25, "_createdOn": "2019-09-20T01:05:57.966Z" }, { "_id": "5d8425f59d1f330017f8f1ea", "name": "Jon Snow", "age": 18, "_createdOn": "2019-09-20T01:05:57.967Z" }, { "_id": "5d8425f59d1f330017f8f1e9", "name": "Arya Stark", "age": 16, "_createdOn": "2019-09-20T01:05:57.967Z" } ]
クエリを使ったレコード取得
# ageが17より大きいレコードを取得 $ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567?q=age:>17' |jq [ { "_id": "5d8425f59d1f330017f8f1ea", "name": "Jon Snow", "age": 18, "_createdOn": "2019-09-20T01:05:57.967Z" }, { "_id": "5d8425f59d1f330017f8f1e8", "name": "Daenerys Targaryen", "age": 25, "_createdOn": "2019-09-20T01:05:57.966Z" } ] # nameがJから始まるレコードを取得 $ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567?q=name:J*' [{"_id":"5d8425f59d1f330017f8f1ea","name":"Jon Snow","age":18,"_createdOn":"2019-09-20T01:05:57.967Z"}] # ,で複数のクエリを組み合わせられる $ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567?q=name:D*,age:>20' # nameがD始まり且つageが20より大きい [{"_id":"5d8425f59d1f330017f8f1e8","name":"Daenerys Targaryen","age":25,"_createdOn":"2019-09-20T01:05:57.966Z"}] # 該当あり $ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567?q=name:D*,age:>26' # nameがD始まり且つageが26より大きい [] # 該当なし
レコード数指定して取得(limit)
$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567?limit=2' |jq [ { "_id": "5d8425f59d1f330017f8f1e9", "name": "Arya Stark", "age": 16, "_createdOn": "2019-09-20T01:05:57.967Z" }, { "_id": "5d8425f59d1f330017f8f1ea", "name": "Jon Snow", "age": 18, "_createdOn": "2019-09-20T01:05:57.967Z" } ]
レコードをスキップして取得(skip)
$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567?skip=1'| jq [ { "_id": "5d8425f59d1f330017f8f1ea", "name": "Jon Snow", "age": 18, "_createdOn": "2019-09-20T01:05:57.967Z" }, { "_id": "5d8425f59d1f330017f8f1e8", "name": "Daenerys Targaryen", "age": 25, "_createdOn": "2019-09-20T01:05:57.966Z" } ]
Update
https://jsonbox.io/box_shuntaka_1234567/${更新対象の_id}
へPUTリクエストで更新できます
$ curl -X PUT 'https://jsonbox.io/box_shuntaka_1234567/5d8425f59d1f330017f8f1e9' \ -H 'content-type: application/json' \ -d '{"name": "Arya Stark", "age": 23}' {"message":"Record updated."}
Delete
https://jsonbox.io/box_shuntaka_1234567/${削除対象の_id}
へDELETEリクエストで削除できます
$ curl -X DELETE 'https://jsonbox.io/box_shuntaka_1234567/5d84220d9d1f330017f8f1e4' {"message":"Record removed."}
一括削除したい場合は、jqとxargsを使えば簡単です
$ curl -X GET 'https://jsonbox.io/box_shuntaka_1234567' | jq -r '.[]._id' | xargs -I{} curl -X DELETE 'https://jsonbox.io/box_shuntaka_1234567/{}' {"message":"Record removed."}{"message":"Record removed."}{"message":"Record removed."}{"message":"Record removed."}{"message":"Record removed."}{"message":"Record removed."}{"message":"Record removed."}
ラッパーライブラリもある
jsonboxを操作するためのラッパーライブラリが用意されています
GoDocを見るといい感じに書けそうですね。。
制限事項
README.mdのLimitationsの翻訳になります
- リクエストは100KBより大きくしてはいけない
- 一度に1000を超えるレコードの登録および、取得は不可
- ボックスに保存するレコードの数に制限はないが、5000件を超えるレコードの大規模なデータセットを保存してAPIを乱用しないこと。これは小規模プロジェクト向けであり、そのため無料で提供されています。
最後に
よかった点は以下の通りです
- 機能がシンプルでわかりやすい
- フィルタリング機能が充実している
- JSONのストレージなので、jqと相性が良い
- Wrapperライブラリがあり、自分の使い慣れた言語で処理がかける
- いつでも操作できる!
- 無料!!
ストレージは公開されているため、仕事だと利用用途が限らます。パブリックなAPIのデータ傾向の調査に利用すると便利そうかなと思いました。趣味だと色んな使い方が出来そうなので、活用していきたいと思います。