Naya Bonbo
Naya Bonbo

Reputation: 406

Ruby library with least footprint to host a very simple single endpoint API

I have a very simple number crunching Ruby function that I want to make available via a web API. The API is essentially a single endpoint, e.g. http://example.com/crunch/<number> and it returns JSON output.

I can obviously install Rails and implement this quickly. I require no more help from a 'framework' other than to handle HTTP for me. No ORM, MVC and other frills.

On the far end, I can write some Ruby code to listen on a port and accept GET request and parse HTTP headers etc. etc. I don't want to re-invent that wheel either.

What can I use to expose a minimal API to the web using something with the least footprint/dependencies. I read about Sinatra, Ramaze, etc., but I believe there can be a way to do something even simpler. Can I just hack some code on top of Rack to do what I am trying to do?

Or in other words, what will be the simplest Ruby equivalent of the following code in nodejs:

var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  var ans = crunch(number);
  res.end(ans);
}).listen(1337, "127.0.0.1");

console.log('Server running at http://127.0.0.1:1337/');

Upvotes: 0

Views: 190

Answers (2)

Leo Nogueira
Leo Nogueira

Reputation: 66

Ruby-Grape is a good option for your use case. It has a minimal implementation over Rack that allow the creation of simple REST-API endpoints.

Cuba is another good option with a thin layer over Rack itself.sample post

If you are familiar with Rails you can use the Rails API gem which is very well documented with minor overhead. Remember also that Rails-API will be part of Rails 5.

Last, but not last you can implement it on Rack directly.

Upvotes: 0

Nick Veys
Nick Veys

Reputation: 23949

You seem like you want to use Rack directly. "Rack from the Beginning" is a decent tutorial that should get you started.

It'll probably look something like this:

class CrunchApp
  def self.crunch(crunchable)
    # top-secret crunching
  end
  def self.call(env)
    crunchy_stuff = input(env)
    [200, {}, crunch(crunchy_stuff)]
  end
  private
  def self.input(env)
    request = Rack::Request.new(env)
    request.params['my_input']
  end
end

Rack::Server.start app: CrunchApp

But I must say, using that instead of something like Sinatra seems silly unless this is just a fun project to play with things. See their 'Hello World':

require 'sinatra'

get '/hi' do
  "Hello World!"
end

Upvotes: 3

Related Questions