HttpTranport

A flexible, modular REST client built for ease-of-use and resilience

Common examples

Supported HTTP methods

Make a HTTP GET request using .get

    const url = 'http://example.com/';
    await HttpTransport.createClient()
        .get(url)
        .asResponse()

    console.log(res);

Make a HTTP POST request using .post

   const url = 'http://example.com/';
   await HttpTransport.createClient()
        .post(url, requestBody)
        .asResponse()

   console.log(res);

PATCH, DELETE, HEAD are also supported.

Query strings

Make a HTTP GET request specifiying query strings using .query

Single query string

    const url = 'http://example.com/';
    const res = await HttpTransport.createClient()
        .get(url)
        .query('example', 'true')
        .asResponse();

    console.log(res);

Multiple query strings:

    const url = 'http://example.com/';
    const res = await HttpTransport.createClient()
        .get(url)
        .query({
          example1: true
          example2: false
        })
        .asResponse();

    console.log(res);

Headers

Make a HTTP GET request specifiying request headers using .headers

Add a single header:

    await HttpTransport.createClient()
        .get(url)
        .headers('someHeader1', 'someValue1')
        .asResponse();

    console.log(res);

Add multiple headers:

    await HttpTransport.createClient()
        .get(url)
        .headers({
          'someHeader1' : 'someValue1'
          'someHeader2' : 'someValue2'
        })
        .asResponse();

    console.log(res);

Handling errors

Convert Internal Server responses (500) to errors:

    const toError = require('@bbc/http-transport-to-error');

    const url = 'http://example.com/';
    const client = HttpTransport.createBuilder()
      .use(toError())
      .createClient();  // for all requests

    await client.get(url)
        .asResponse();

    console.error(err);

toError is only required if the underlying client does not support HTTP error conversion. The default transport is request, which does not convert errors.

Retries

Make a HTTP GET and retry twice on error .retry

const toError = require('@bbc/http-transport-to-error');

const client = HttpTransport.createBuilder()
        .use(toError())
        .createClient();

        const res = await client.get('http://example.com/')
        .retry(2)
        .asResponse();

        console.log(res);

Timeouts

Make a HTTP GET and timeout after 50ms .query

const body = await HttpTransport.createClient()
      .get(url)
      .timeout(50)
      .asBody();

Using the Client buider

The builder can be used to define behavior for all requests. This includes:

  • Default retries
  • Default retry delay
  • Default user agent
  • Middleware

The builder is instantiated via .createBuilder:

const HttpTransport = require('@bbc/http-transport');
const builder = HttpTransport.createBuilder();

createClient instantiates a configured transport client:

const url = 'http://example.com/';
const HttpTransport = require('@bbc/http-transport');

const builder = HttpTransport.createBuilder();

const client = builder
    .use(toError())
    .retries(2)
    .createClient();

const body = await client.get(url).asBody();

Middleware

Middleware are functions that can be executed with before and after a request. Middleware is typically used to:

  • Modify the request object e.g set headers
  • Terminate a request early e.g for caching purposes
  • Modify the response object e.g format the response body

Middlware can be executed per request using the .use method:

    const exampleMiddleware = require('exampleMiddleware');

    const url = 'http://example.com/';
    const client = HttpTransport.createClient();

    const res = await client
        .use(exampleMiddleware()) // only for this request         
        .get(url)
        .asResponse();

    console.error(err);

Middlware can also be executed for every request using the .use of the client builder. The client builder is created using the createBuilder method:

    const exampleMiddleware = require('exampleMiddleware');

    const url = 'http://example.com/';
    const client = HttpTransport.createBuilder()
      .use(exampleMiddleware()) // for all requests
      .createClient();  

    await client
        .get(url)
        .asResponse();

    console.error(err);

For writing middleware, see the offical guide

Offical HttpTransport middleware

See Caching

See Collapsing

See Errors

See Stats

See Ratelimiting

Using alternative HTTP clients via transport decorators

Make a HTTP GET request and supply a alternative HTTP transport via .createClient

const url = 'http://example.com/';
const HttpTransport = require('@bbc/http-transport');
const OtherTranport = require('some-other-transport');

const res = await HttpTransport.createClient(OtherTranport)
   .get(url)
   .asResponse();

  if (res.statusCode === 200) {
    console.log(res.body);
  }
});

Callback support

HttpTransport does not support callbacks. However, to integrate with legacy code, use the callback adapter