Add a WebAPIResource class for creating more RESTful APIs.

Review Request #1528 — Created April 21, 2010 and submitted




Add a WebAPIResource class for creating more RESTful APIs.

This introduces a new class for easily creating RESTful URL resources
that can handle standard HTTP methods and return meaningful data in a
nicely constructed hierarchy.

By using WebAPIResource, a site can offer a very clean set of URLs to
work with any object.

There's a lot to this object, but it's all covered in the extensive
documentation in webapi/

Review Board will be using this for its new more RESTful API.

There's more I want to do for this soon, such as automatic documentation
generation and proper mimetype detection, but I wanted to get this in
as a base first.
Tested this with my upcoming Review Board change for the web API. 
  2. djblets/webapi/ (Diff revision 3)
    Why not just have headers default to {}?
    1. I think the reason I did it was to not add stuff to the passed in headers dictionary in the case of it being the default {} (as those values would be used the next time), but I really should just copy the dictionary anyway, since it is being modified.
  3. djblets/webapi/ (Diff revision 3)
    Will 'method' or 'callback' ever be in supported_fields? If not, you can get rid of the check above.
    1. These are actually special parameters that are handled by the Djblets webapi code. They should never be in supported_fields, but we want to pretend they're valid anyway. I don't know if you meant the check that you commented on or the previous one, but I don't think I can get rid of either and have this work.
  4. djblets/webapi/ (Diff revision 3)
    I assume you meant "Resources"?
  5. djblets/webapi/ (Diff revision 3)
Review request changed
Change Summary:
* Cleaned up get_href and made it require a request parameter. It should always get passed one, so there's no reason for it to be optional.
* Renamed get_links_for_resources to get_links.
* Added documentation for get_links.
* Resource names are now expected to use '_' instead of '-', with normalization to '-' happening for uri_name.
* Moved the encoders to, and brought back the original code for BasicAPIEncoder, in order to maintain backwards-compatibility.
* Fixed the checks for determining when to call get_list in order to work with resources that don't have a Model, but do have a list of child resources.
* Check for "_method" in the decorator instead of "method", since it's been renamed.
* The headers dictionary in WebAPIResponseError now defaults to {} and is properly copied before modification in order to prevent data leaking into the passed in dictionary.