No description
f9b1e7fc50
Instead of directly interpreting a server as a `RoutingApplication`, this change introduces the concept of a `Router`, which is a datatype with several constructors. In particular, the type of the `route` function changes from route :: Proxy layout -> Server layout -> RoutingApplication to route :: Proxy layout -> IO (RouteResult (Server layout)) -> Router Most important in practice is the case of the `StaticRouter` constructor in `Router`. For choices between statically known paths, we can now use a lookup table to dispatch requests rather than trying each request individually. This brings down routing complexity of a common case from O(n) to O(log n). Another important change is that the handler that is passed down by `route` is no longer of type `Server layout`, but of type `IO (RouteResult (Server layout))`. This means that API constructs can "delay" checks and failure. For example, `ReqBody` does not have to fetch the request body and feed it to the handler immediately; it can instead record these actions in the handler that is passed down. The code will only be executed at a leaf / endpoint of the API. This is desired behaviour: We prefer to save work by doing all matching on static path components first. Furthermore, we get better error codes by doing so. |
||
---|---|---|
scripts | ||
servant | ||
servant-blaze | ||
servant-client | ||
servant-docs | ||
servant-examples | ||
servant-jquery | ||
servant-lucid | ||
servant-server | ||
.ghci | ||
.gitignore | ||
.travis.yml | ||
README.md | ||
servant.png | ||
sources.txt |
servant
These libraries provides a family of combinators to define webservices and automatically generate the documentation and client-side querying functions for each endpoint.
In order to minimize the dependencies depending on your needs, we provide these features under different packages.
servant
, which contains everything you need to declare a webservice API.servant-server
, which lets you implement an HTTP server with handlers for each endpoint of an API.servant-client
, which lets you derive automatically Haskell functions that let you query each endpoint of aservant
webservice.servant-docs
, which lets you generate API docs for your webservice.servant-jquery
, which lets you derive Javascript functions (based on jquery) to query your API's endpoints, in the same spirit asservant-client
.servant-blaze
andservant-lucid
provide easy HTML rendering of your data as anHTML
content-type "combinator".
Tutorial
We have a tutorial guide that introduces the core types and features of servant. After this article, you should be able to write your first servant webservices, learning the rest from the haddocks' examples.