Go to file
2009-10-14 00:46:14 +02:00
Data/Object Removed model bits 2009-10-14 00:46:14 +02:00
Hack/Middleware Added method override middleware 2009-08-04 10:05:02 +03:00
Web Removed model bits 2009-10-14 00:46:14 +02:00
.gitignore Replaced UrlRewriter with HandlerParser 2009-08-04 15:52:21 +03:00
LICENSE Imported existing code, documentation incomplete 2009-06-28 01:55:14 +03:00
README.md Slight documentation update 2009-09-16 23:33:34 +03:00
restful.cabal Removed model bits 2009-10-14 00:46:14 +02:00
Setup.lhs Test framework; overlap checking 2009-09-24 00:58:55 +03:00
Test.hs Test framework; overlap checking 2009-09-24 00:58:55 +03:00
TODO Removed model bits 2009-10-14 00:46:14 +02:00

A Restful front controller built on Hack.

Below is an overview of how the refactored code will hopefully turn out.

Terminology

Verb

HTTP request methods. Possible values: GET, POST, PUT, DELETE. Please see http://rest.blueoxen.net/cgi-bin/wiki.pl?MinimumMethods. In sum:

GET: Read only. PUT: Replace data on server. DELETE: Remove data from server. POST: Some form of update.

Note: not all clients support PUT and DELETE. Therefore, we need a workaround. There are two fixes:

  1. X-HTTP-Method-Override header.
  2. Get parameter _method_override (ie, in the query string). This will be more useful for web forms.

See MethodOverride middleware.

Resource

A Resource is a single URL. Each Resource can be addressed with the four verbs, though does not necesarily support all of them. There are a few different ways of passing parameters:

  1. URL parameter. For example, you can set up your application so that /articles/my_title/ will hand off to the article resource with a parameter of my_title. The idea here is to avoid the regexs present in most other frameworks and provide a uniform interface for all parameters.

  2. Get parameter, ie query string.

  3. Post parameter, ie content body. This is not available for GET requests. However, it is available for PUT and DELETE.

  4. Headers, including cookies.

ResourceName

As a side point to the URL parameter mentioned above: let us say you have multiple resources like /articles/my_title/ and /articles/other_title/. You clearly do not want to write code twice to process these requests. Instead, convert the article name into a URL parameter and then articles will have its own ResourceName.

NOTE: This has taken on a very central role in the restful library, in addition to the RestfulApp class. Hopefully I will have a chance to document this soon. As a result, some of the following documentation is outdated.

ResourceParser

A ResourceParser converts a Resource (ie, a URL) to a ResourceName and URL parameters.

RawRequest

The parsed data sent from the client. Has, for example, GET and POST parameters, not QUERY_STRING and CONTENT_BODY.

Request

Request is actually a type class for parsing a RawRequest. This allows putting all form handling code and the like into a single place. Your handler code (see below) need only deal with your data type.

Representation

Some method of showing data to the client. These are identified by MIME types. For the most part, you should be using hierarchichal data (see Data.Object). There are some exceptions, such as:

  • HTML for non-Ajax clients (search engines, old browsers).
  • Atom/RSS feeds.
  • Sitemaps.

Whenever possible, use Data.Object, as this will automatically handle some basic representations (JSON, JSONP, Yaml, XML, undecorated HTML).

Response

Contains basic HTTP response information and something which can be represented in different ways.

Handler

There is a single Handler for each combination of ResourceName and Verb. A Handler takes some instance of Request and returns a Response.

HandlerMap

Maps a ResourceName/Verb pair to a Handler.

Application

An application is essentially a ResourceParser and HandlerMap. It also has some settings involved.

Static files

All static files should go under the /static/ path. A typical application will probably have a Javascript file in there which deals directly with the entire Restful API.

Non-Ajax clients

Search engines nad older clients should not be ignored. However, it is quite tedious to write view code twice. Hopefully, in the future there will be a view component to this framework which can automate some of that process.

Passing global data

You should use function currying to pass around global information (the list of entries in a blog, a database connection, etc).