=encoding utf-8 =head1 NAME Spore (Bpecifications to a Brtable BEST Bnvironment) Description Implementation =head1 ABSTRACT Spore is a specification for describing REST API that can be parsed and used automatically by client implementations to communicate with the described API. This document describes what features are required in a Spore client implementation. =head1 TERMINOLOGY =over 4 =item API An I is a REST application that can exchange data with client applications over HTTP/HTTPS. It presents one or more method endpoints which accept HTTP requests with varying headers, parameters and body content to perform specific operations. =item Client implementation A I is a library targeting a specific system or language. It can use I to create programmatic interfaces usable in applications. =item Description file A I is a file in JSON format describing an I (see specification). It can directly be used by a I to create a programmatic interface in the target system. =item Middleware A I is Spore component that is added to the workflow of the I to modify the I and I sent and received. It can also shortcut the rest of the workflow if needed. It can be thought of as a plugin to extend Spore. =item Request A I is a data structure that contains standardized data and metadata inspired by the CGI specification. It is used by the I to create the HTTP request that will be sent to the I. =item Response A I is a data structure that contains standardized data and metadata inspired by the CGI specification. It is created from the HTTP response sent by the I and is used after being processed by the I to create the structure returned to the user. =back =head1 SPECIFICATION =head2 Client Implementation A I B provide a function or method (e.g. new_from_spec) to generate the specific API methods in the target system by reading the JSON string from a I (and optionally directly from the file itself). A I B also provide a method to enable or disable spore middlewares at run-time. The order in which the middlewares are enabled is the order in which the request will go through each middleware, and the inverse order in which the response will go through each optional middleware post-processing callback. It B also have a method to selectively enable a middleware or not for each method according to the method properties in the specification. If middlewares I, I and I were enabled in this order, then the processing order will be: I, I, I ... make request ... I, I, I =head2 Middleware Each middleware B accept arbitrary initialization parameters. It B provide a way to only conditionally use a middleware (e.g. B). It B also provide a function to which the request environment or an object containing it will be passed. The function can have 3 types of return values: =over 4 =item Nothing Control is passed to the next middleware in the chain. =item A callback Control is passed to the next middleware in the chain. The callback is stored and will be passed the response later on after the request is made. =item A response The response is directly passed to the first stored callback in the chain. No further middlewares are used and no request is sent. Useful if a middleware needs to short-circuit the remaining of the chain, for testing or caching purpose for example. =back =head3 The Request environment The request environment B be a data structure that includes CGI-like headers, as detailed below. Each middleware is free to modify the environment. The environment B include these keys (adopted from L, L, L and L) except when they would normally be empty. The environment is used by the I to build the final HTTP request that will be sent to the I. =over 4 =item * C: The HTTP request method, such as "GET" or "POST". This B be an empty string, and so is always required. =item * C: The initial portion of the base URL's path, minus the scheme and domain name. This tells the client what is the API virtual "location". This may be an empty string if the method corresponds to the server's root URI. If this key is not empty, it B start with a forward slash (C). =item * C: The remainder of the request URL's path, designating the virtual "location" of the request's target within the API. This may be an empty string if the request URL targets the application root and does not have a trailing slash. It still contains the placeholders which will be interpolated later with the parameters. If this key is not empty, it B start with a forward slash (C). =item * C: The undecoded, raw request URL line. It is the raw URI path and query part that appears in the HTTP C line and doesn't contain URI scheme and host names. It still contains the placeholders which will be interpolated later with the parameters. =item * C, C: When combined with C and C, these keys can be used to complete the URL. Note, however, that C, if present, should be used in preference to C for reconstructing the request URL. C and C B be empty strings, and are always required. =item * C: The portion of the request URL that follows the C, if any. May be empty, but is always required. It will always be empty before the request is actually made and sent. =item * C: The actual content body of the call. Modified in place by the middlewares. =item * C: A list of key/value pairs. These will be interpolated in the URL with the placeholders when the request is made. The rest of them will be used in the C part of the URI and the payload key will define the actual content. B be empty but B always be present. =item * C: An ordered list of all the intermediate URL that were tried by the fetcher. =item * C: The scheme of the URL. =item * C: The list of expected HTTP statuses for this request in the response. =back =head1 CHANGELOGS 0.1: 2010.10.xx =over 4 =item * Initial version. =back =head1 ACKNOWLEDGEMENTS Some parts of this specification are adopted from the following specifications. =over 4 =item * PSGI Specification L =item * PEP333 Python Web Server Gateway Interface L =item * Rack L =item * JSGI Specification L =back I'd like to thank authors of these great documents. =head1 AUTHOR =over 4 =item franck cuny =item nils grunwald =back =head1 CONTRIBUTORS =over 4 =item damien "bl0b" leroux =back =head1 COPYRIGHT AND LICENSE Copyright XXX, 2010. This document is licensed under the Creative Commons license by-sa. =cut