GreenLightning
  • GreenLightning
  • Chapter 0: What is Green Lightning?
    • Downloads
    • FAQs
    • Benchmarks
  • Chapter 1: Getting Started with GreenLightning
    • What you need
    • Simple REST Server
      • Getting Started
      • Structures and Fields
      • Saying Hello
      • Posting and Responding with JSON
    • Comprehensive Start Guide
  • Chapter 2: Configuration
    • HTTP Configuration
    • MQTT Configuration
    • TLS Certificates
  • Chapter 3: Listeners and Behaviors
    • Default Listeners
    • Blocking Behaviors
  • Chapter 4: Routes
    • Basic Routing
  • Chapter 5: PubSub
    • Publish & Subscribe
  • Chapter 6: Clients
    • HTTP Client
    • MQTT Client
Powered by GitBook
On this page
  • Example
  • Methods
  • HTTPRequestService.httpGet(ClientHostPortInstance session, String route, optional: HeaderWritable headers)
  • HTTPRequestService.httpPost(ClientHostPortInstance session, String route, Writable payload)
  • HTTPRequestService.httpPost(ClientHostPortInstance session, String route, HeaderWritable headers, Writable payload)
  • HTTPRequestService.httpClose(ClientHostPortInstance session)
  1. Chapter 6: Clients

HTTP Client

PreviousChapter 6: ClientsNextMQTT Client

Last updated 6 years ago

Your GreenLightning app can also function as a HTTP client for sending REST requests, etc... to other servers and parsing the response.

Please refer to the repo for more examples like this one.

Use the code below to get started with creating a HTTP client.

Example

This is an example GreenLightning App in which we want to hit up a server somewhere containing JSON weather data (or see on how to build your own REST service).

In this example, we build a simple app that performs a GET request to a local server which servers a static JSON file containing "wather data":

First, we create our client. We specify that we are also acting as a HTTP client on line 8, and create the client instance on line 11. We also declare the JSON fields we care about.

Client.java
public class Client implements GreenApp
{
    private ClientHostPortInstance weatherSession;

    @Override
    public void declareConfiguration(Builder config) {
        // In this example, we have TLS enabled.
        HTTPClientConfig netClientConfig = config.useNetClient();

        // We directly parse JSON of the current session.
        weatherSession = netClientConfig.createHTTP1xClient("127.0.0.1", 443)
                .parseJSON()
                    .stringField("condition", WeatherFields.WEATHER_CONDITIONS)
                    .decimalField("temperature", WeatherFields.TEMP_KELVIN)
                .finish();
    }

    @Override
    public void declareBehavior(GreenRuntime runtime) {
        // Add the weather behavior here.
        runtime.addResponseListener(new WeatherBehavior(runtime, weatherSession))
                .acceptHostResponses(weatherSession);
    }
    
}

Create the field identifiers:

WeatherFields.java
package com.ociweb;

public enum WeatherFields {
    WEATHER_CONDITIONS, TEMP_KELVIN
}

WeatherBehavior will be responsible for sending out the request and receiving the response. We use a HTTPRequestService to do this.

WeatherBehavior.java
public class WeatherBehavior implements HTTPResponseListener, StartupListener, ShutdownListener {
    // Keep track of active session for get request.
    private ClientHostPortInstance session;
    
    // This will actually perform the request.
    private final HTTPRequestService clientService;

    public WeatherBehavior(GreenRuntime runtime, ClientHostPortInstance session) {
        // Create the request service.
        clientService = runtime.newCommandChannel().newHTTPClientService();
        this.session = session;
    }

    @Override
    public void startup() {
        // Send out the request on startup.
        clientService.httpGet(session, "/api/weather");
    }
    
    @Override
    public boolean acceptShutdown() {
        // Close the session when shutting down.
        return clientService.httpClose(session);
    }

    @Override
    public boolean responseHTTP(HTTPResponseReader reader) {
        // We need to open the payload data.
        reader.openPayloadData( (r)-> {
            // Since we want to directly parse the fields, it needs to be structured.
            StructuredReader s = r.structured();

            // Read the fields from JSON.
            double tempKelvin = s.readDecimalAsDouble(WeatherFields.TEMP_KELVIN);
            String conditions = s.readText(WeatherFields.WEATHER_CONDITIONS);

            // Do whatever you'd like with the data here, this is just a short example.
            // Usually, you would use a PubSub service to send this information back to
            // another behavior.
            System.out.println(conditions + ", " + tempKelvin);
        });

        return true;
    }
}

Methods

HTTPRequestService.httpGet(ClientHostPortInstance session, String route, optional: HeaderWritable headers)

Sends a GET request to the route (host is defined in session). Optional headers can be written.

clientService.httpGet(session, "/api/weather");
clientService.httpGet(session, "/shopping", 
                header -> header.write(HTTPHeaderDefaults.SET_COOKIE, "__Secure-ID=123; Secure; Domain=example.com"));

You can also write multiple headers:

clientService.httpGet(session, "/shopping",
        header -> {
            header.write(HTTPHeaderDefaults.SET_COOKIE, "__Secure-ID=123; Secure; Domain=example.com");
            header.write(HTTPHeaderDefaults.DATE, "Wed, 21 Oct 2018 07:28:00 GMT");
});

HTTPRequestService.httpPost(ClientHostPortInstance session, String route, Writable payload)

Sends a POST request to the route (host is defined in session). Optional headers can be written.

clientService.httpPost(session, "/post_comment", payload -> {
            payload.writeUTF("This is a comment.");
});

HTTPRequestService.httpPost(ClientHostPortInstance session, String route, HeaderWritable headers, Writable payload)

Sends a POST request to the route (host is defined in session) with custom headers.

clientService.httpPost(session, "/post_comment",
                header-> header.write(HTTPHeaderDefaults.DATE, "Wed, 21 Oct 2018 07:28:00 GMT"),
                payload -> {
                    payload.writeUTF("This is a comment.");
                });

HTTPRequestService.httpClose(ClientHostPortInstance session)

Closes the current session. Usually, you want to call this in the acceptShutdown() method using a ShutdownListener in your behavior.

@Override
public boolean acceptShutdown() {
    return clientService.httpClose(session);
}

GreenLightning-API
Simple REST Server