Could I get some feedback on the following strategy for mapping CloudStack RPC commands to HTTP requests?
The general approach is to: 1. map each category of command to a URL. Each category corresponds roughly to a resource type being manipulated. E.g. /cloudstack/latest/storagepool/ 2. make the command itself a path under the category E.g. /cloudstack/latest/storagepool/create 3. make resource changes using a POST request with parameters JSON encoded in the body E.g. POST /cloudstack/latest/storagepool/{create | modify | destroy} POST /cloudstack/latest/volumes/{create | destroy} POST /cloudstack/latest/vm/{start | stop} 4. query resource state using a GET request that identifies specific resources with a query parameter E.g. GET /cloudstack/latest/vm?id=1&id=2&id=3 Commands are mapped to paths for simplicity. Identifying CRUD operations such as create, modify and destroy from the path limits the HTTP methods to POST and GET. Serialising parameters as JSON in the body of a POST request is for simplicity. Passing all command data in the URI is difficult, because URIs are ill suited to expressing object trees that exist in complex commands such as the VM StartCommand. Since parameters such as VM identifier are already in the body, static URIs can be used for many commands. Commands that push data from the agent to the server have to be implemented as polling operations. This applies to initial configuration commands and the hypervisor ping. Agent configuration will come from HTTP POST versions of StartupRoutingCommand and StartupStorageCommand, rather than a config file copied to the hypervisor as was done with KVM. To simulate a PingCommand the ServerComponent will use a HTTP GET. Versioning is by way of dated path rather than version number. Assuming the latest API is completed 2013/02/04, /cloudstack/latest and /cloudstack/2013-04-02 refer to the same API.