Skip to content

Instantly share code, notes, and snippets.

HTTP API Design Guide

(Copy of internal Heroku document for sharing with collaborators.)

Introduction

This guide describes the design of RESTful HTTP+JSON APIs conforming to Heroku’s API conventions. It’s based on our design work for the Heroku Platform API.

This guide informs additions to that API and also guides new internal APIs at Heroku. We hope it’s also of interest to API designers outside of Heroku.

For each Ruby module/class, we have Ruby methods on the left and the equivalent
Clojure functions and/or relevant notes are on the right.
For clojure functions, symbols indicate existing method definitions, in the
clojure namespace if none is explicitly given. clojure.contrib.*/* functions can
be obtained from http://github.com/kevinoneill/clojure-contrib/tree/master,
ruby-to-clojure.*/* functions can be obtained from the source files in this
gist.
If no method symbol is given, we use the following notation:

Keybase proof

I hereby claim:

  • I am mmcgrana on github.
  • I am mmcgrana (https://keybase.io/mmcgrana) on keybase.
  • I have a public key ASDXYWj0J0tYgYI1487IvTW794oGTH7eSp3V7_Ah5-dh1Ao

To claim this, I am signing this object:

An Gist

This is a thing:

def foo
  puts "bar" + :bat.to_s
end
@mmcgrana
mmcgrana / server.clj
Created January 8, 2012 22:12 — forked from anonymous/server.clj
http.server example
(ns http.server
(:require [vertx.http :as http]))
(def server (http/server))
(defn vertx-start
[]
(-> server
(http/on-request
(fn [req resp]
(ns demo.handle
(:import (sun.misc Signal SignalHandler)))
(defn trap-signal [sig f]
(Signal/handle (Signal. sig)
(proxy [SignalHandler] []
(handle [_] (f)))))
(defn trap-shutdown [f]
(let [rt (Runtime/getRuntime)]
#!/usr/bin/env bash
if [ "$1" == "repl" ]; then
CLASSPATH=$(lein classpath)
JAVA_OPTS="$JAVA_OPTS -Duser.home=$HOME"
JLINE="jline.ConsoleRunner"
exec java $JAVA_OPTS -cp $CLASSPATH $JLINE clojure.main --repl
else
export LEIN_VERSION="1.4.2"
LEIN_PLUGINS="$(ls -1 lib/dev/*jar 2> /dev/null | tr \\n \:)"
var sys = require('sys');
var fleetdb = require('./fleetdb');
var db = new fleetdb.Database();
db.open('http://127.0.0.1:3400');
var done = 0;
setInterval(function() {
if (done == 100000) {
var sys = require('sys'),
fleetdb = require('./fleetdb');
var db = new fleetdb.Database();
db.open('http://127.0.0.1:3400');
done = 0;
for(var i=0; i<10000; i++) {
db.query(['ping'], function(status, data) {
done += 1;
log: node server.js