Search code examples
restapi-designhateoas

What is the "Restful" way to command a server?


I have a REST endpoint to create an application configuration as such

POST /applications

With a body

{
    "appName" : "my-new-app"
}

I returns a newly created application configuration:

{
  "appName": "my-new-app",
  "appId": "2ed17ff700664dad9bb32e400d39dc68",
  "apiKey": "$2a$10$XVDH9F3Ix4lx2LdxeJ4ZOe7H.bw/Me5qAmaIGF.95lUgkerfTG7NW",
  "masterKey": "$2a$10$XVDH9F3Ix4lx2LdxeJ4ZOeSZLR1hVSXk2We/DqQahyOFFY6nOfbHS",
  "dateCreated": "2021-03-28T11:00:07.340+00:00",
  "dateUpdated": "2021-03-28T11:00:07.340+00:00"
}

Note: The keys are auto-generated in the server and not passed from the client.

My question here is, what's the RESTful way to command the server to reset the keys for example:

PUT /applications/my-new-app/update_keys is not noun-based and thus, not restful, also passing a command as query parameter does not also seem to be restful since this is not a GET method rather it's a PUT (update) method.


Solution

  • Here's one way to send a command that is as much as possible RESTful:

    Endpoint:

    POST /application/:appName/actions

    Example Payload:

    {
        "actions" : [
          {
            "action" : "name_of_command",
            "arguments" : {
              "arg1" : "param1"
            }
          },
          {
            "action" : "reset_keys",
            "arguments" : {
            }
          }
        ]
    }
    

    Actions would be nouns that are part of the endpoint, and the server will process actions that are submitted (or posted) within the endpoint. And an array of actions would be best suited to allow multiple actions to be sent. And each action having arguments would also be desirable for future actions that would need arguments.