godai-kaihatsu / gondwana

https://gondwana.godai.co.jp/
2 stars 0 forks source link

HTTP API / JSON-RPC-2.0 を batch 形式にも対応したい #43

Closed usagi closed 6 years ago

usagi commented 6 years ago

JSON-RPC-2.0 では規格として [ <JSON-RPC-2.0 REQUEST OBJECT> ] 的に複数のリクエストを単一の HTTP リクエストし、レスポンスを受ける batch の仕様がある。 G4 でも GeoObject APIs などの実装が進むと、今よりも複雑な操作を連続して行いたい需要も予想され、また現在の実装でもテクスチャーを表示するビルボード型の GeoObject を生成するためには定型的に低レベル APIs を5回ほど叩く必要もあり、 batch への対応は連携アプリの開発者にそれなりに高いニーズがあると考えられる。

4.0.0.10 現在、 G4 では batch 形式には未対応となっている。本チケットでは G4 HTTP API / JSON-RPC-2.0 を batch にも対応させたい。

usagi commented 6 years ago

実装した。 4.0.0.12 に新機能として取り込みます。

usagi commented 6 years ago

この機能を使うと、これまで例えば curl であればシェルから:

curl -Ss -i http://127.0.0.1:50080/api/json-rpc-2.0/ -X POST --data '{ "jsonrpc": "2.0", "id": null, "method": "GeoObject.New" }'
curl -Ss -i http://127.0.0.1:50080/api/json-rpc-2.0/ -X POST --data '{ "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetVertexLocal", "params": { "id": 0, "vertices": [ 0.0, 0.0, 0.0, -1000, 0, -1000, 1000, 0, -1000, -1000, 0, 1000, 1000, 0, 1000 ] } }'
curl -Ss -i http://127.0.0.1:50080/api/json-rpc-2.0/ -X POST --data '{ "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetUV", "params": { "id": 0, "uvs": [ 0.5,0.5, 0,1, 1,1, 0,0, 1,0 ] } }'
curl -Ss -i http://127.0.0.1:50080/api/json-rpc-2.0/ -X POST --data '{ "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetLocationByAltLatLon", "params": { "id": 0, "location": [ 1898.0, 42.826667, 140.811389 ] } }'
curl -Ss -i http://127.0.0.1:50080/api/json-rpc-2.0/ -X POST --data '{ "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetIndex", "params": { "id": 0, "indices": [ 0,1,2, 0,3,1, 0,2,4, 0,4,3, 0,2,1, 0,1,3, 0,4,2, 0,3,4 ] } }'
curl -Ss -i http://127.0.0.1:50080/api/json-rpc-2.0/ -X POST --data '{ "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetMaterialType", "params": { "id": 0, "material_type": "Texture" } }'
curl -Ss -i http://127.0.0.1:50080/api/json-rpc-2.0/ -X POST --data '{ "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetBillboard", "params": { "id": 0, "is_billboard": true } }'
curl -Ss -i http://127.0.0.1:50080/api/json-rpc-2.0/ -X POST --data '{ "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetMaterialParam", "params": { "id": 0, "material_params": { "EmissiveColorFactor": 1 } } }'

このようにユーザープログラム側が API を叩く分だけ HTTP リクエストする必要があったものが、

request.json:

[ { "jsonrpc": "2.0", "id": null, "method": "GeoObject.New" }
, { "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetVertexLocal", "params": { "id": 0, "vertices": [ 0.0, 0.0, 0.0, -1000, 0, -1000, 1000, 0, -1000, -1000, 0, 1000, 1000, 0, 1000 ] } }
, { "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetUV", "params": { "id": 0, "uvs": [ 0.5,0.5, 0,1, 1,1, 0,0, 1,0 ] } }
, { "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetLocationByAltLatLon", "params": { "id": 0, "location": [ 1898.0, 42.826667, 140.811389 ] } }
, { "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetIndex", "params": { "id": 0, "indices": [ 0,1,2, 0,3,1, 0,2,4, 0,4,3, 0,2,1, 0,1,3, 0,4,2, 0,3,4 ] } }
, { "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetMaterialType", "params": { "id": 0, "material_type": "Texture" } }
, { "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetBillboard", "params": { "id": 0, "is_billboard": true } }
, { "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetMaterialParam", "params": { "id": 0, "material_params": { "EmissiveColorFactor": 1 } } }
]
curl -Ss -i http://127.0.0.1:50080/api/json-rpc-2.0/ -X POST -d @request.json

このように1回のリクエストに連続実行させたい複数の API をリストで投げつけ、

HTTP/1.1 200 OK
Content-Length: 504
Content-Type: application/json

[
        {
                "jsonrpc": "2.0",
                "id": null,
                "result": 0
        },
        {
                "jsonrpc": "2.0",
                "id": null,
                "result": null
        },
        {
                "jsonrpc": "2.0",
                "id": null,
                "result": null
        },
        {
                "jsonrpc": "2.0",
                "id": null,
                "result": null
        },
        {
                "jsonrpc": "2.0",
                "id": null,
                "result": null
        },
        {
                "jsonrpc": "2.0",
                "id": null,
                "result": null
        },
        {
                "jsonrpc": "2.0",
                "id": null,
                "result": null
        },
        {
                "jsonrpc": "2.0",
                "id": null,
                "result": null
        }
]

連続実行した結果をまとめて1回のレスポンスとして受け取れるようになりました。

これにより、連続した APIs の実行効率が向上し、APIを使用するユーザーが複数の APIs を組み立てて作りやすくなりました。

usagi commented 6 years ago

wiki: https://github.com/godai-kaihatsu/gondwana/wiki/dev'http_api'batch