npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

rest-kit

v0.1.0

Published

Tool kit for rapid development of REST API bindings.

Downloads

3

Readme

restkit-logo

Tool kit for rapid development of REST API bindings.

CodeshipCI

Ever tried to integrate with a RESTful API, only to find out there are no client libraries on npm? RESTkit is here to help.

RESTkit attempts to provide a minimalistic framework for creating RESTful API clients, where you only need to worry about service-specific logic, while all plumbing and stuff is taken care of for you.

Getting Started

$ npm install rest-kit --save
const RestKit = require('rest-kit');

Creating an API binding library is as easy as supplying a few bits of information to the RestKit.


RestKit({
  root: 'https://api.example.com/v1'
}, {
  auth: RestKit.Resource({ ... })
});

RestKit.Endpoint()

An endpoint is a single method exposed by the REST API. For example, DELETE /record/:id is an endpoint. Endpoints are created using RestKit.Endpoint function, though normally you wouldn't need to do that yourself.

const endpoint = RestKit.Endpoint(config, spec);

Every endpoint is described by an object that lets RESTkit know how to call it. Following are properties supported by RestKit.Endpoint.

path

Required.

Path portion of the API URL, in addition to the API root specified in config during instantiation. path is joined to the API root url, therefore the preceding slash is ignored, and relative paths will not work.

RestKit.Endpoint(config, {
  path: '/records'
});

method

Optional, default value: GET.

Specifies the HTTP method that should be used when calling the endpoint.

RestKit.Endpoint(config, {
  path: '/records',
  method: 'POST'
});

query

Optional, default value: { }

Specifies mapping from parameters to query parameters. RESTkit endpoints do not make distinction between URL parameters, query parameters and request body. Everything is handled for the user. Listing query parameters here lets RESTkit know that these parameters are meant for query string.

RestKit.Endpoint(config, {
  path: '/records',
  query: {
    id: 'record_id'
  }
});

The reason it's an object rather than array is because query parameter names can be long and using notation incompatible with the project styling. Providing a mapping would allow users to use shorter parameter names. In the example above, if user calls records({ id: 'foo' }), the URL will eventually become /records?record_id=foo.

If you only need to specify query parameters, but choose not to use name mapping, you can always pass in an array, and it will be expanded into appropriate mapping.

RestKit.Endpoint(config, {
  path: '/records',
  query: ['record_id']
});

params

Optional, default value: [ ]

Specifies required parameters that are accepted as function arguments. All parameters specified here are required, and omitting them will trigger an error.

RestKit.Endpoint(config, {
  path: '/records',
  params: ['id']
});

records(123);

Of course, parameters that are listed in query can also be listed here.

pre

Optional, default value: (req) => { }

Provides a function hook that is executed before sending the request, but after all parameters are processed and defaults are applied. The function accepts a single argument req, which is the request data with all headers and parameters (see request-promise for more).

RestKit.Endpoint(config, {
  path: '/records',
  pre: (req) => { req.headers['User-Agent'] = 'RESTkit/1.0'; }
});

post

Optional, default value: (res) => { }

Provides a function hook that is executed after receiving the response. The function accepts a single argument res, which is the complete response received from request-promise. This is your opportunity to modify response body before it is returned from the endpoint function.

RestKit.Endpoint(config, {
  path: '/records',
  pre: (req) => { req.headers['User-Agent'] = 'RESTkit/1.0'; }
});

error

Optional, default value: (err, res) => { }

Provides a function hook that is executed when there is an error. The function accepts two arguments. err is the Error object caught during HTTP call, and res is the response object. This is your opportunity to throw another error. If you don't, the original error will be thrown.

It is impossible to silence the error.

RestKit.Endpoint(config, {
  path: '/records',
  error: (err, res) => { throw new Error(`OOPS: ${res.body.message}`); }
});

RestKit.Resource()

A resource is a group of API endpoints that serve related purposes. You can think of them as of directories, whereas in the API library they will be grouped under the same property.

For example:

const auth = {
  login: {
    method: 'POST',
    path: '/auth',
    params: [ 'username', 'password' ]
  },
  logout: {
    method: 'DELETE',
    path: '/auth'
  }
};

const api = RestKit({
  root: 'https://api.example.com/v1'
}, {
  auth: RestKit.Resource(auth)
})

The keys of the resource object will become function names, while values are objects describing corresponding endpoints (see Describing Endpoints for more). You can then call the API endpoints you just described like this:

const client = api();

await client.auth.login('user', 'password');
await client.auth.logout();

RestKit()

Once you have all your resources ready to go, you can export the API client factory by simply calling RestKit and providing a few pieces configuration. For example:

module.exports = RestKit({
  root: 'https://api.example.com/v1'
}, {
  required: ['token']
}, {
  auth: RestKit.Resource(auth)
})

There are additional options available for more advanced configuration of RESTkit. RESTkit accepts three arguments, which are the following:

defaults

Required.

Specifies default configuration values that can be overwritten by the user. Since you can access the config value from various hooks, you can put anything here.

defaults.root

Required.

This value specifies the root URI of the API.

defaults.headers

Optional, default value: { }

Specifies a hash of headers that are applied to every API call. Note that if user specifies config.headers during API client creation, this value will be overwritten.

defaults.params

Optional, default value: { }

Specifies URL parameters that are applied to every API call. Note that if user specifies config.params during API client creation, this value will be overwritten.

defaults.query

Optional, default value: { }

Specifies query parameters that are applied to every API call. Note that if user specifies config.query during API client creation, this value will be overwritten.

defaults.body

Optional, default value: { }

Specifies request body parameters that are applied to every API call. Note that if user specifies config.body during API client creation, this value will be overwritten.

More Examples

Passing API token in Authorization header

const RestKit = require('rest-kit');


const api = RestKit({
  root: 'https://api.example.com/v1',
  headers: { }
}, {
  required: ['token'],
  oncreate() {
    this.config$.headers.Authorization = `token ${this.config$.token}`;
  }
}, {
  auth: RestKit.Resource({
    login: {
      method: 'POST',
      path: '/auth',
      params: [ 'username', 'password' ]
    },
    logout: {
      method: 'DELETE',
      path: '/auth'
    }
  })
});

const client = api({ token: 'foobarbaz' });

await client.auth.login('user', '12345');