Making REST requests with StreamLink

This page describes how to tunnel REST GET, POST, PUT, and DELETE operations through StreamLink to a REST endpoint, via the Liberator REST adapter.

Available from: StreamLink 8

Requires: Liberator 8

Requirements

You require:

  • StreamLink 8

  • A Caplin Platform stack running Liberator 8 with the LiberatorRESTAdapter blade activated and configured. For more information, see Activating the REST Adapter.

Overview

The StreamLink class provides four methods for interacting with REST services proxied by the Liberator REST Adapter:

HTTP Method StreamLink method

GET

StreamLink.snapshot(subject, subscriptionListener, subscriptionParameters)

POST

StreamLink.create(subject, commandParameters, commandListener)

PUT

StreamLink.publish(subject, commandParameters, commandListener)

DELETE

StreamLink.delete(subject, commandParameters, commandListener)

REST operations are packaged in RTTP format for transport to and from Liberator. An example request flow for a GET request is shown below:

Example 1. GET request

A Liberator REST Adapter is configured to map requests to subjects beginning /EXAMPLE/… to a REST service’s base-URL:

global_config/overrides/LiberatorRESTAdapter/DataSource/etc/datasource.conf
add-rest-mapping
    subject-prefix  /EXAMPLE/
    base-url        https://www.example.com/api/v1/
end-rest-mapping
global_config/overrides/LiberatorRESTAdapter/Liberator/etc/rttpd.conf
add-data-service
    service-name     LiberatorRESTAdapter${THIS_LEG}
    service-type     rest
    include-pattern  ^/EXAMPLE/
…

The REST service has a collection, news, available at https://www.example.com/api/v1/news. This collection is exposed to StreamLink clients as subject /EXAMPLE/news.

The sequence diagram below illustrates a StreamLink client using the StreamLink.snapshot() method to make a GET request to the REST service’s news collection:

Caplin PlatformStreamLink ClientLiberatorREST AdapterREST ServiceStreamLink.snapshot("/EXAMPLE/news", ...)RTTP messageDataSource packetadd-rest-mappingsubject-prefix /EXAMPLE/base-url https://www.example.com/api/v1/end-rest-mappingGET https://www.example.com/api/v1/newsHTTP responseDataSource packet(HTTP status + payload)RTTP message(HTTP status + payload)SubscriptionListener.onJsonUpdate()
GET request to /EXAMPLE/news

Getting started

StreamLink’s REST methods require a StreamLink instance with a registered JSONHandler instance.

The example code below creates a JSONHandler that uses the Fast JSON Patch and Immer libraries:

var jsonHandler = {
    parse: function (jsonString) {
        return JSON.parse(jsonString);
    },
    patch: function (existingObject, jsonPatchString) {
        var patch = JSON.parse(jsonPatchString);
        var result = immer.produce(existingObject,
            function (existing) {
                return patch.reduce(jsonpatch.applyReducer, existing);
            });
        return result;
    },
    format: function(obj) {
        return JSON.stringify(obj, null, "\t");
    }
};

Pass the JSONHandler instance to StreamLinkFactory.create to create an instance of StreamLink with a registered JSON handler:

var streamLink = caplin.streamlink.StreamLinkFactory.create({
    username: "admin",
    password: "admin",
    liberator_urls: "rttp://localhost:18080",
    json_handler: jsonHandler
});
streamLink.connect();

GET requests

Use StreamLink.snapshot to send a GET request.

Example GET request
let subscriptionListener = {
    onJsonUpdate(subscription, evt) {
        console.log(evt);
    },
    onSubscriptionError(subscription, evt) {
    },
    onSubscriptionStatus(subscription, evt) {
    }
};
streamLink.snapshot("/EXAMPLE/news", subscriptionListener);

The SubscriptionListener.onJsonUpdate method passes in a JsonEvent object. To retrieve the JSON payload as a JavaScript object, call JsonEvent.getJSON().

If the REST method accepts parameters, append them to the subject as a querystring:

streamLink.snapshot("/EXAMPLE/news?page=2", subscriptionListener);

POST requests

Use StreamLink.create to send a POST request.

Example POST request
let commandListener = {
    onCommandError: (subject, commandErrorEvent) => {
        console.log("onCommandError", subject);
    },
    onCommandResult: (subject, commandResultEvent) => {
        console.log("onCommandResult", subject, commandResultEvent);
    }
};
let payload = {
    title: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
    author: "John Smith"
};
streamLink.create("/EXAMPLE/news", payload, commandListener);

If the response includes a payload, call CommandResultEvent.getPayload() to retrieve it.

PUT requests

Use StreamLink.publish to send a PUT request.

Example PUT request
let commandListener = {
    onCommandError: (subject, commandErrorEvent) => {
        console.log("onCommandError", subject);
    },
    onCommandResult: (subject, commandResultEvent) => {
        console.log("onCommandResult", subject, commandResultEvent);
    }
};
let payload = {
    id: "63f92d0c1a3d3",
    title: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
    author: "George Smith"
};
streamLink.publish("/EXAMPLE/news/63f92d0c1a3d3", payload, commandListener);

If the response includes a payload, call CommandResultEvent.getPayload() to retrieve it.

DELETE requests

Use StreamLink.delete to send a DELETE request.

Example DELETE request
let commandListener = {
    onCommandError: (subject, commandErrorEvent) => {
        console.log("onCommandError", subject);
    },
    onCommandResult: (subject, commandResultEvent) => {
        console.log("onCommandResult", subject, commandResultEvent);
    }
};
let payload = null;
streamLink.delete("/EXAMPLE/news/63f92d0c1a3d3", payload, commandListener);

If the response includes a payload, call CommandResultEvent.getPayload() to retrieve it.


See also: