Got a chance to play with Goliath for a bit. You don’t need to do much work to mount Grape behind it. Grape figures out content-negotiation and formatting for you, so just stream the response through Goliath.
module Acme
class Ping < Grape::API
format :json
get '/ping' do
{ ping: "pong" }
end
end
class App < Goliath::API
use Goliath::Rack::Params
use Goliath::Rack::Render
def response(env)
Acme::API.call(env)
end
end
end
Tests for something like this are a little bit tricky, because Goliath is fully asynchronous.
describe Acme::API do
it "ping" do
with_api Acme::App do
get_request(path: "/api/ping") do |async|
async.response.should == { ping: "pong" }.to_json
end
end
end
end
Working code in https://github.com/dblock/grape-on-goliath.
There’s also a very complete demo with asynchronous IO and PostgreSQL here. Haven’t tried it, but looks very promising.