2016-01-25 14:11:40 +01:00
|
|
|
Servant tutorial
|
|
|
|
================
|
|
|
|
|
2016-02-06 12:33:53 +01:00
|
|
|
This is an introductory tutorial to the current version of *servant*, which is
|
|
|
|
**0.4**. Any comment or issue can be directed to `this website's issue
|
|
|
|
tracker <http://github.com/haskell-servant/haskell-servant.github.io/issues>`_.
|
2016-01-25 14:11:40 +01:00
|
|
|
|
|
|
|
Github
|
|
|
|
-------
|
|
|
|
|
2016-02-06 12:33:53 +01:00
|
|
|
- the servant packages: `haskell-servant/servant <https://github.com/haskell-servant/servant>`_
|
|
|
|
- the website (including this tutorial): `haskell-servant/haskell-servant.github.io <https://github.com/haskell-servant/haskell-servant.github.io/>`_
|
2016-01-25 14:11:40 +01:00
|
|
|
- Feel free to use the issue tracker (or to send PRs!) on the website's repository to give feedback and suggestions about this tutorial
|
|
|
|
|
|
|
|
Introduction
|
|
|
|
-------------
|
|
|
|
|
|
|
|
*servant* has the following guiding principles:
|
|
|
|
|
|
|
|
- concision
|
|
|
|
|
|
|
|
This is a pretty wide-ranging principle. You should be able to get nice
|
|
|
|
documentation for your web servers, and client libraries, without repeating
|
|
|
|
yourself. You should not have to manually serialize and deserialize your
|
|
|
|
resources, but only declare how to do those things *once per type*. If a
|
|
|
|
bunch of your handlers take the same query parameters, you shouldn't have to
|
|
|
|
repeat that logic for each handler, but instead just "apply" it to all of
|
|
|
|
them at once. Your handlers shouldn't be where composition goes to die. And
|
|
|
|
so on.
|
|
|
|
|
|
|
|
- flexibility
|
|
|
|
|
|
|
|
If we haven't thought of your use case, it should still be easily
|
|
|
|
achievable. If you want to use templating library X, go ahead. Forms? Do
|
|
|
|
them however you want, but without difficulty. We're not opinionated.
|
|
|
|
|
|
|
|
- separation of concerns
|
|
|
|
|
|
|
|
Your handlers and your HTTP logic should be separate. True to the philosphy
|
|
|
|
at the core of HTTP and REST, with *servant* your handlers return normal
|
|
|
|
Haskell datatypes - that's the resource. And then from a description of your
|
|
|
|
API, *servant* handles the *presentation* (i.e., the Content-Types). But
|
|
|
|
that's just one example.
|
|
|
|
|
|
|
|
- type safety
|
|
|
|
|
|
|
|
Want to be sure your API meets a specification? Your compiler can check
|
|
|
|
that for you. Links you can be sure exist? You got it.
|
|
|
|
|
|
|
|
To stick true to these principles, we do things a little differently than you
|
|
|
|
might expect. The core idea is *reifying the description of your API*. Once
|
|
|
|
reified, everything follows. We think we might be the first web framework to
|
|
|
|
reify API descriptions in an extensible way. We're pretty sure we're the first
|
|
|
|
to reify it as *types*.
|
|
|
|
|
|
|
|
To be able to write a webservice you only need to read the first two sections,
|
|
|
|
but the goal of this document being to get you started with servant, we also
|
|
|
|
cover the couple of ways you can extend servant for a great good.
|
|
|
|
|
|
|
|
Tutorial
|
|
|
|
---------
|
|
|
|
|
|
|
|
.. toctree::
|
2016-01-25 22:30:16 +01:00
|
|
|
:maxdepth: 1
|
2016-01-25 14:11:40 +01:00
|
|
|
|
2016-01-27 22:58:38 +01:00
|
|
|
ApiType.lhs
|
|
|
|
Server.lhs
|
|
|
|
Client.lhs
|
|
|
|
Javascript.lhs
|
|
|
|
Docs.lhs
|