NAME

Plack::Middleware::REST - Route PSGI requests for RESTful web applications

SYNOPSIS

# $get, $update, $delete, $create, $list, $patch, $app must be PSGI applications
builder {
    enable 'REST',
        get          => $get,           # GET /{id}
        upsert       => $update,        # PUT /{id}
        delete       => $delete,        # DELETE /{id}
        create       => $create,        # POST /
        list         => $list,          # GET /
        patch        => $patch,         # PATCH /{id}
        head         => 1,              # HEAD /{$id} => $get, HEAD / => $list
        options      => 1,              # support OPTIONS requests
        pass_through => 1,              # pass everything else to $app
        patch_types  => ['text/plain']; # optional accepted patch types
    $app;
};

DESCRIPTION

Plack::Middleware::REST routes HTTP requests (given in PSGI request format) on the principles of Representational State Transfer (REST). In short, the application manages a set of resources with common base URL, each identified by its URL. One can retrieve, create, update, delete, list, and patch resources based on HTTP request methods.

Let's say an instance of Plack::Middleware::REST is mounted at the base URL http://example.org/item/. The following HTTP request types can be recognized, once they have been assigned:

POST http://example.org/item/

Calls the PSGI application create to create a new resource with URL assigned by the application.

GET http://example.org/item/123

Calls the application get to retrieve an existing resource identified by http://example.org/item/123.

PUT http://example.org/item/123

Calls the PSGI application upsert to either update an existing resource identified by http://example.org/item/123 or to create a new resource with this URL. The application may reject updates and/or creation of new resources, acting like an update or insert method.

DELETE http://example.org/item/123

Calls the PSGI application delete to delete an existing resource identified by http://example.org/item/123.

GET http://example.org/item/

Calls the PSGI application list to get a list of existing resources.

PATCH http://example.org/item/123

Calls the PSGI application patch to update an existing resource identified by http://example.org/item/123. The application may reject updates of resources.

OPTIONS http://example.org/item/

Calls the PSGI application to return the allowed methods for the resource.

Other requests result either result in a PSGI response with error code 405 and a list of possible request types in the Accept header, or the request is passed to the underlying application in the middleware stack, if option pass_through is set.

CONFIGURATION

get

create

upsert

delete

list

patch

The options get, create, upsert, delete, list, patch can be set to PSGI applications to enable the corresponding REST request type. One can also use string aliases, including app to pass the request in the middleware stack:

builder {
    enable 'REST',
        get          => 'app',   # pass GET requests on resource to $wrapped
        create       => $create, # pass POST to base URL to $create
        upsert       => $update; # pass PUT requests on resources to $update
        pass_through => 0;       # respond other requests with 405
    $wrapped;
};

By default (head => 1) the app configured to get and/or list resources are also assumed to handle HEAD requests. Setting this configuration to 0 will disallow HEAD requests. The special value auto will rewrite HEAD requests with Plack::Middleware::Head.

options

By default (options => 1) the app is configured to handle OPTIONS requests for a resource. Setting this configuration to 0 will dissallow OPTIONS requests.

pass_through

Respond to not allowed requests with HTTP 405. Enabled by default, but this may change in a future version of this module!

patch_types

Optional array of acceptable patch document types for PATCH requests. Respond to unacceptable patch document types with HTTP 415.

COPYRIGHT AND LICENSE

Copyright 2014- Jakob Voß

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

CONTRIBUTORS

Jakob Voß and Chris Kirke

SEE ALSO