Silk
Product Examples Tutorials

Announcing rest - A Haskell REST framework

By: Adam Bergmark June 30th 2014

We are excited to officially announce the open source release of our REST framework rest!

rest is a set of packages used to write, document, and use RESTful applications. You write your API in Haskell using rest's DSL. This API can then be run in different web frameworks like happstack, snap, or wai. Additionally, you can automatically generate documentation from it, as well as client libraries for Haskell and Javascript. We have been using it in production for most of our services for a long time and we like it so much that we decided to share it with the public.

If you want to start using rest, check out the tutorial or the example application. You can also come to the Haskell Exchange 2014 where Erik will give a talk about rest. We’d also be happy to answer any questions you have, shoot us an e-mail!

The most important packages are:

  • rest-core: A DSL for defining versioned and web server agnostic REST resources. This is the workhorse of the framework
  • rest-gen: Automatically generates documentation, Haskell, JavaScript, and Ruby clients from a rest API
  • rest-snap, rest-happstack, rest-wai: Drivers for running resources using the web server of your choice

We have also released other packages that are either used by or can be used with rest:

  • rest-client: Used by haskell clients generated by rest-gen
  • rest-types: Types used by the other rest packages
  • json-schema: Define and derive schemas for JSON serializations
  • generic-aeson: Generically derives JSON serializations for data types minimalistically
  • regular-xmlpickler: Generically derives XML serializations for data types
  • aeson-utils: Utilities for working with Aeson.
  • hxt-pickle-utils: Utility functions for using HXT picklers
  • multipart: HTTP Multipart implementation forked from the cgi package
  • rest-stringmap: Maps with string-like keys with built-in serialization to XML and JSON (since JSON doesn’t allow arbitrary keys)
  • code-builder: String manipulation library for code generation

We had a great time working on rest at ZuriHac (thanks for organizing, Better!) and we are happy to see that a lot of people were interested in our work. We got a lot done, here are some highlights:

  • Erik wrote an introductory tutorial to rest
  • Håkan Thörnqvist rewrote the rest-gen Haskell code generator to use haskell-src-exts, it was released in rest-gen-0.14
  • Christian Berentsen did several things:
    • Cleaned up the interface of json-schema, it was released in json-schema-0.6
    • Added support for outputing Fay compatible json as a separate output type (we want to make it easier to extend rest with more output types so things like this can go in external packages)
    • Implemented a generic API discovery resource that you can hook into your API with no configuration
  • Tom Lokhorst helped out with some always appreciated bug fixing
  • Sebas wrote the rest-wai driver to make sure everyone can use the web server they prefer together with rest
  • Adam worked on the rest-example application and rewrote parts of rest-gen to make the code generator and the library interface simpler
  • wiz did performance benchmarks and created a script to generate haddocks for rest itself

I hope I didn’t forget anyone. A big thanks to everyone who participated!

All the mentioned projects are available on hackage and in public repositories on github. We also created a public mailing list for all our open source projects.

We use these packages to write our Haskell API code for Silk.
Join our team if you enjoy this stuff too, we’re hiring!
  • Tweet
  • Like
  • email
  • google+
  • github
haskellweb

This is Silk’s Engineering Blog

Silk is a platform to create, share and find information, such as your favorite places or recipes, information related to a project, your investment portfolio or stats about the countries of the world.

Create a Silk site
Silk
  • About
  • Jobs
  • Developers
  • Twitter
  • Facebook
  • Github
  • Blog
  • Engineering Blog