Skip to content

dev'http_api'batch

Usagi Ito edited this page Jan 9, 2018 · 1 revision

JSON-RPC-2.0バッチ

4.0.0.12 で JSON-RPC-2.0 のバッチ形式のリクエストに対応しました。連続して実行したい複数の APIs を1回のリクエストにまとめ、1回のレスポンスで全ての APIs の実行結果群を取得できるようになりました。

この機能を使うと、これまで例えば 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 を組み立てて作りやすくなりました。

参考

  1. #43 HTTP API / JSON-RPC-2.0 を batch 形式にも対応したい#issuecomment-356206096
Clone this wiki locally
You can’t perform that action at this time.