Request/Response

Requests are used to ask the server to take specific actions. This shows how requests should be formed by the client and how the reponses should look. The details of different request types are defined in other parts of the specification.

WebSockets and Other Full-duplex Protocols

The exact format of the message for a specific request is defined elsewhere in the specification.

A request must include a client generated requestId. TherequestId is a string and it must be a version 4 UUID. It will always be included in any response to the request by the server.

For example, a request to PUT a value:

{
  "requestId": "123345-23232-232323",
  "put": {
    "path": "electrical.switches.anchorLight.state",
    "value": 1
  }
}

The server will respond with a message which includes the requestId, a state, and a statusCode.

The state can be FAILED, PENDING or COMPLETED.

The statusCode will be any standard HTTP code including the following.

  • 200 - the request was successful
  • 400 - something is wrong with the client's request
  • 401 - the request has not been applied because it lacks valid authentication credentials
  • 403 - the client does not have permission to make the request
  • 405 - the server does not support the request
  • 502 - something went wrong carrying out the request on the server side
  • 504 - timeout on the server side trying to carry out the request

The message can optionally contain an informational, human oriented message.

The response object may contain other response data depending on the specific request being made. For example, a response to an authentication request could contain a login object.

{
  "requestId": "123345-23232-232323",
  "state": "COMPLETED",
  "statusCode": 200,
  "login": {
    "token": "....."
  }
}

A server may respond to a request multiple times depending on how it processes the request.

PENDING

When a server cannot process the request immediately, it will respond with the state PENDING:

{
  "requestId": "123345-23232-232323",
  "state": "PENDING",
  "statusCode": 202
}

FAILED

When a server fails read, or process the request (eg a server error), it will respond with the state FAILED:

{
  "requestId": "123345-23232-232323",
  "state": "FAILED",
  "statusCode": 500
}

###COMPLETED

When processing is done, but it was not successful:

{
  "requestId": "123345-23232-232323",
  "state": "COMPLETED",
  "statusCode": 502,
  "message": "Unable to contact the light"
}

When processing completed successfully:

{
  "requestId": "123345-23232-232323",
  "state": "COMPLETED",
  "statusCode": 200
}

###Query a Request

The state of a request can also be found by sending the following:

{
  "requestId": "123345-23232-232323",
  "query": true
}

This will result in a reply like the examples above.

HTTP

HTTP requests use REST API semantics and the responses are similar to the response object used above.

One difference is that the statusCode value is also sent as the HTTP response code.

The response when a server successfully processes a login request synchronously:

HTTP response code 200

{
  "requestId": "123345-23232-232323",
  "state": "COMPLETED",
  "token": "eyJhbGciOiJIUzI1NiI...aQ8sN1XBAP8bt3tNBT1WiIttm3qM",
  "statusCode": 200
}

When a request is PENDING, an HTTP 202 (Accepted) code will be returned and the body will include an href to use to check the status of the request. A client should then periodically poll the server to get the status. A client should not poll the server at a rate less than 500ms.

HTTP response code 202

{
  "requestId": "123345-23232-232323",
  "state": "PENDING",
  "href": "/signalk/v1/api/actions/12567",
  "statusCode": 202
}

The contents of the response message when checking the status will include the values defined above for the result object and may also include extra information related to the request.

For example, the result of a PUT request:

{
   "requestId": "123345-23232-232323",
   "state": "COMPLETED",
   "statusCode": 200
}